2015-05-14 43 views
5

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

user:[email protected](localhost:3306)/database_name 

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

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

回答

19

你可以完美地使用go-sql-driver。但是,您需要使用具有适当访问权限的mysql用户来创建新的数据库。

下面是一个例子:

func create(name string) { 

    db, err := sql.Open("mysql", "admin:[email protected](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

+0

'database/sql'维护一个连接池。当我建立一个新的连接时,我看到“Error 1046:No database selected”弹出。在'database/sql'打开一个新的连接之后,有没有办法自动运行db.Exec(“USE”+ name)'? – mlangenberg

+0

是的,只要将数据库名称放在连接字符串中:“user:password @ tcp(hostname:port)/ dbname” –

+1

啊,所以先不带数据库名称的sql.Open(...)'运行'db.Exec(“CREATE DATABASE IF NOT EXISTS”+ name)'。然后关闭连接,使用*数据库名称'sql.Open(.../name)'*来创建一个数据库并在池中安全地使用它。 – mlangenberg

1

一个很好的数据库/ SQL教程和文档如果你想创建一个新的数据库,如果不存在的话,直接在程序中使用它,要知道,database/sql维护一个连接池。

因此,打开的数据库连接应该最好包含数据库名称。我看过"Error 1046: No database selected",当database/sql手动使用db.Exec("USE "+name)后打开一个新的连接。

func createAndOpen(name string) *sql.DB { 

    db, err := sql.Open("mysql", "admin:[email protected](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:[email protected](127.0.0.1:3306)/" + name) 
    if err != nil { 
     panic(err) 
    } 
    defer db.Close() 
    return db 
} 
+2

自从你调用'defer db.Close()'后,'return db'将会被关闭。 – Xeoncross

相关问题