是否可以在建立连接后检查MySQL数据库是否存在。
我知道如何检查一个表是否存在于一个DB,但我需要检查DB是否存在。如果不是,我必须调用另一段代码来创建它并填充它。
我知道这一切听起来有点不优雅-这是一个快速和肮脏的应用程序。
是否可以在建立连接后检查MySQL数据库是否存在。
我知道如何检查一个表是否存在于一个DB,但我需要检查DB是否存在。如果不是,我必须调用另一段代码来创建它并填充它。
我知道这一切听起来有点不优雅-这是一个快速和肮脏的应用程序。
当前回答
冗长而令人费解(但请容忍我!),这里是一个类系统,我做的检查是否DB存在,并创建所需的表:
<?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替换为您喜欢的任何数据库名称,也可以将创建者脚本更改为任何名称,并且(希望!)不会破坏它。如果有人可以改进这一点,请告诉我!
请注意 如果你不使用Visual Studio和PHP工具,不要担心这些区域,它们是用于代码折叠的
其他回答
一个非常简单的bash一行代码:
mysqlshow | grep dbname
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
如果你只是需要知道一个db是否存在,这样当你尝试创建它时就不会得到一个错误,只需使用(从这里):
CREATE DATABASE IF NOT EXISTS DBName;
当您没有足够权限查看数据库时,使用INFORMATION_SCHEMA或show数据库是不可靠的。当您无法访问数据库时,它似乎不存在。创建之后就会失败。另一种更精确的检查方法是使用use命令的输出,尽管我不知道这种方法有多可靠(文本输出在未来版本/其他语言中会有变化……),所以请注意。
CHECK=$(mysql -sNe "use DB_NAME" 2>&1)
if [ $? -eq 0 ]; then
# database exists and is accessible
elif [ ! -z "$(echo $CHECK | grep 'Unknown database')" ]; then
# database does not exist
elif [ ! -z "$(echo $CHECK | grep 'Access denied')" ]; then
# cannot tell if database exists (not enough permissions)"
else
# unexpected output
fi
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
Golang解决方案
创建一个测试包并添加:
import "database/sql"
// testing database creation
func TestCreate(t *testing.T){
Createdb("*Testdb") // This just calls the **sql.DB obect *Testdb
db,err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/*Testdb")
if err != nil{
panic(err)
}
defer db.Close()
_, err = db.Exec("USE *Testdb")
if err != nil{
t.Error("Database not Created")
}
}