在建立数据库连接后,有没有可能检查数据库(MySQL)是否存在。
我知道如何检查 DB 中是否存在表,但我需要检查 DB 是否存在。如果不存在,我必须调用另一段代码来创建并填充它。
我知道这听起来有点不太优雅 - 这只是一个快速而简单的应用程序。
在建立数据库连接后,有没有可能检查数据库(MySQL)是否存在。
我知道如何检查 DB 中是否存在表,但我需要检查 DB 是否存在。如果不存在,我必须调用另一段代码来创建并填充它。
我知道这听起来有点不太优雅 - 这只是一个快速而简单的应用程序。
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
以下是我用bash脚本实现的方法:
#!/bin/sh
DATABASE_USER=*****
DATABASE_PWD=*****
DATABASE_NAME=my_database
if mysql -u$DATABASE_USER -p$DATABASE_PWD -e "use $DATABASE_NAME";
then
echo "Database $DATABASE_NAME already exists. Exiting."
exit
else
echo Create database
mysql -u$DATABASE_USER -p$DATABASE_PWD -e "CREATE DATABASE $DATABASE_NAME"
fi
SELECT
IF(EXISTS( SELECT
SCHEMA_NAME
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = 'DbName'),
'Yes',
'No') as exist
虽然有些冗长和复杂(但请耐心阅读!),这是我创建的一个类系统,用于检查数据库是否存在以及创建所需的表:
<?php
class Table
{
public static function Script()
{
return "
CREATE TABLE IF NOT EXISTS `users` ( `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT );
";
}
}
class Install
{
#region Private constructor
private static $link;
private function __construct()
{
static::$link = new mysqli();
static::$link->real_connect("localhost", "username", "password");
}
#endregion
#region Instantiator
private static $instance;
public static function Instance()
{
static::$instance = (null === static::$instance ? new self() : static::$instance);
return static::$instance;
}
#endregion
#region Start Install
private static $installed;
public function Start()
{
var_dump(static::$installed);
if (!static::$installed)
{
if (!static::$link->select_db("en"))
{
static::$link->query("CREATE DATABASE `en`;")? $die = false: $die = true;
if ($die)
return false;
static::$link->select_db("en");
}
else
{
static::$link->select_db("en");
}
return static::$installed = static::DatabaseMade();
}
else
{
return static::$installed;
}
}
#endregion
#region Table creator
private static function CreateTables()
{
$tablescript = Table::Script();
return static::$link->multi_query($tablescript) ? true : false;
}
#endregion
private static function DatabaseMade()
{
$created = static::CreateTables();
if ($created)
{
static::$installed = true;
}
else
{
static::$installed = false;
}
return $created;
}
}
在这里,您可以将数据库名称en
替换为任何您喜欢的数据库名称,并且还可以更改创建者脚本到任何内容,(希望!)它不会破坏它。如果有人能够改进此内容,请告诉我!
注意
如果您不使用带有PHP工具的Visual Studio,则不必担心区域,它们用于代码折叠:P
SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DbName'
1 - 存在,0 - 不存在
"USE 'DBname'"
然后检查结果是否为FALSE。 否则,可能会出现访问被拒绝的错误,但我无法知道。 因此,在涉及特权的情况下,可以使用:
"SHOW DATABASES LIKE 'DBname'"
如前所述。
Rails 代码:
ruby-1.9.2-p290 :099 > ActiveRecord::Base.connection.execute("USE INFORMATION_SCHEMA")
ruby-1.9.2-p290 :099 > ActiveRecord::Base.connection.execute("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development'").to_a
SQL (0.2ms) SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development'
=> [["entos_development"]]
ruby-1.9.2-p290 :100 > ActiveRecord::Base.connection.execute("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development1'").to_a
SQL (0.3ms) SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development1'
=> []
=> entos_development 存在,entos_development1 不存在
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName')
BEGIN
-- Database exists, so do your stuff here.
END
如果你使用的是MSSQL而不是MySQL,请查看这个类似主题的答案。
另一种基于PDO的php解决方案:
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=dbname', 'root', 'password', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]);
echo 'table dbname exists...';
}
catch (PDOException $e) {
die('dbname not found...');
}
$db = new PDO ( $dns, $usr, $pwd, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] );
- Herbert Peters