【问题标题】:How to create a new MySQL database with go-sql-driver如何使用 go-sql-driver 创建一个新的 MySQL 数据库
【发布时间】:2015-07-25 22:24:26
【问题描述】:

我正在编写自动克隆数据库的 Golang 脚本。 我正在使用 go-sql-driver 但我在文档中找不到创建新数据库的方法。 连接到 MySQL 需要一个 URL 方案,例如:

user:password@tcp(localhost:3306)/database_name

但是数据库还不存在,我只是想连接到服务器然后创建一个新的。

我该怎么做?我必须使用其他驱动程序吗?

【问题讨论】:

    标签: mysql go


    【解决方案1】:

    您可以完美地使用 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)
    • 是的,当然...只需将数据库名称放在连接字符串中:“user:password@tcp(hostname:port)/dbname”
    • 啊,所以首先 sql.Open(...) 没有数据库名称,然后运行 ​​db.Exec("CREATE DATABASE IF NOT EXISTS " + name)。然后关闭连接,sql.Open(.../name)with 数据库名称创建数据库并与池一起安全使用。
    • 诚实的问题:这不是教科书式的例子吗?有没有办法使用占位符参数来完成这项工作?
    【解决方案2】:

    如果您想在不存在的情况下创建一个新数据库,并直接在您的程序中使用它,请注意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()
    【解决方案3】:

    我的 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
    }
    

    【讨论】:

    • 不确定这是否可行,因为 gorm 一开始就无法建立任何连接。
    猜你喜欢
    • 2011-07-27
    • 2012-02-23
    • 2021-07-19
    • 2013-07-07
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多