如何使用go sql驱动程序创建新的MySQL数据库

如何使用go sql驱动程序创建新的MySQL数据库,mysql,go,Mysql,Go,我正在研究自动克隆数据库的Golang脚本。 我正在使用GoSQL驱动程序,但在文档中找不到创建新数据库的方法。 连接到MySQL需要URL方案,如: user:password@tcp(localhost:3306)/database_name 但是数据库还不存在,我只想连接到服务器,然后创建一个新的 我该怎么做?我必须使用另一个驱动程序?您完全可以使用go sql驱动程序。但是,您需要使用具有适当访问权限的mysql用户来创建新数据库 以下是一个例子: func create(name s

我正在研究自动克隆数据库的Golang脚本。 我正在使用GoSQL驱动程序,但在文档中找不到创建新数据库的方法。 连接到MySQL需要URL方案,如:

user:password@tcp(localhost:3306)/database_name
但是数据库还不存在,我只想连接到服务器,然后创建一个新的


我该怎么做?我必须使用另一个驱动程序?

您完全可以使用go sql驱动程序。但是,您需要使用具有适当访问权限的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)
   }
}
请注意,连接字符串中未提供数据库名称。我们只是在连接之后创建数据库(createdatabase命令),然后切换连接以使用它(use命令)


注意:在

上,用户可以维护一个很好的数据库/sql教程和文档。如果您想创建一个不存在的新数据库,并直接在程序中使用它,请注意,
数据库/sql
维护一个连接池

因此,打开的数据库连接最好包含数据库名称。在手动使用
db.Exec(“使用”+name)
后,当
数据库/sql
打开一个新连接时,我看到了
“错误1046:未选择任何数据库”

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
}

对于go ORM 2.0,我的db_config.go文件看起来像:

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
}

数据库/sql
维护一个连接池。我看到在建立新连接时弹出“错误1046:未选择数据库”。有没有办法在
数据库/sql
打开新连接后自动运行
db.Exec(“使用”+name)
。。。只需将数据库名称放入连接字符串:“用户:password@tcp(hostname:port)/dbname“啊,所以首先
sql.Open(…)
不带数据库名,然后运行
db.Exec(“如果不存在创建数据库”+name)
。然后关闭连接,
sql。用数据库名打开(…/name)
以创建数据库并将其安全地用于池。诚实的提问:这不是一个关于如何打开自己进行sql注入的教科书式示例吗?无法使用占位符参数执行此操作吗?
返回db
将关闭,因为您调用了
延迟db.Close()
。不确定此操作是否有效,因为gorm首先无法建立任何连接。