【发布时间】:2015-07-25 22:24:26
【问题描述】:
我正在编写自动克隆数据库的 Golang 脚本。 我正在使用 go-sql-driver 但我在文档中找不到创建新数据库的方法。 连接到 MySQL 需要一个 URL 方案,例如:
user:password@tcp(localhost:3306)/database_name
但是数据库还不存在,我只是想连接到服务器然后创建一个新的。
我该怎么做?我必须使用其他驱动程序吗?
【问题讨论】:
我正在编写自动克隆数据库的 Golang 脚本。 我正在使用 go-sql-driver 但我在文档中找不到创建新数据库的方法。 连接到 MySQL 需要一个 URL 方案,例如:
user:password@tcp(localhost:3306)/database_name
但是数据库还不存在,我只是想连接到服务器然后创建一个新的。
我该怎么做?我必须使用其他驱动程序吗?
【问题讨论】:
您可以完美地使用 go-sql-driver。但是,您需要使用具有适当访问权限的 mysql 用户来创建新数据库。
这是一个例子:
func create(name string) {
db, err := sql.Open("mysql", "admin:admin@tcp(127.0.0.1:3306)/")
if err != nil {
panic(err)
}
defer db.Close()
_,err = db.Exec("CREATE DATABASE "+name)
if err != nil {
panic(err)
}
_,err = db.Exec("USE "+name)
if err != nil {
panic(err)
}
_,err = db.Exec("CREATE TABLE example ( id integer, data varchar(32) )")
if err != nil {
panic(err)
}
}
请注意,连接字符串中未提供数据库名称。我们只是在连接之后创建数据库(CREATE DATABASE 命令),然后切换连接使用它(USE 命令)。
注意:VividCortex 人员在http://go-database-sql.org/index.html 维护了一个不错的数据库/sql 教程和文档
【讨论】:
database/sql 维护一个连接池。我已经看到在建立新连接时弹出“错误 1046:未选择数据库”。有没有办法在database/sql 打开新连接后自动运行db.Exec("USE "+name)?
sql.Open(...) 没有数据库名称,然后运行 db.Exec("CREATE DATABASE IF NOT EXISTS " + name)。然后关闭连接,sql.Open(.../name)with 数据库名称创建数据库并与池一起安全使用。
如果您想在不存在的情况下创建一个新数据库,并直接在您的程序中使用它,请注意database/sql 维护一个连接池。
因此打开的数据库连接,最好包含数据库名称。当database/sql 在手动使用db.Exec("USE "+name) 后打开新连接时,我已经看到"Error 1046: No database selected"。
func createAndOpen(name string) *sql.DB {
db, err := sql.Open("mysql", "admin:admin@tcp(127.0.0.1:3306)/")
if err != nil {
panic(err)
}
defer db.Close()
_,err = db.Exec("CREATE DATABASE IF NOT EXISTS "+name)
if err != nil {
panic(err)
}
db.Close()
db, err = sql.Open("mysql", "admin:admin@tcp(127.0.0.1:3306)/" + name)
if err != nil {
panic(err)
}
defer db.Close()
return db
}
【讨论】:
return db 将关闭,因为您调用了defer db.Close()。
我的 db_config.go 文件看起来像 GO ORM 2.0:
package infrastructure
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm2.0/utils"
)
//Setup Models: initializaing the mysql database
func GetDatabaseInstance() *gorm.DB {
get := utils.GetEnvWithKey
USER := get("DB_USER")
PASS := get("DB_PASS")
HOST := get("DB_HOST")
PORT := get("DB_PORT")
DBNAME := get("DB_NAME")
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", USER, PASS, HOST, PORT, DBNAME)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
_ = db.Exec("CREATE DATABASE IF NOT EXISTS " + DBNAME + ";")
if err != nil {
panic(err.Error())
}
return db
}
【讨论】: