How to create a new MySQL database with go-sql-driver

huangapple go评论94阅读模式
英文:

How to create a new MySQL database with go-sql-driver

问题

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

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

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

我该如何做?我需要使用另一个驱动程序吗?

英文:

I'm working on Golang script that automatically clone a database.
I'm using go-sql-driver but i can't find in the documentation a way to create a new database.
Connection to MySQL require an URL scheme like:

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

But the database not exists yet, I just want to connect to the server and then create a new one.

How can I do that? I have to use another driver?

答案1

得分: 43

你可以完全使用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上维护了一个很好的database/sql教程和文档。

英文:

You can perfectly use the go-sql-driver. However, you need to use a mysql user which has the proper access rights to create new databases.

Here is an example:

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)
   }
}

Note that the database name is not provided in the connection string. We just create the database after the connection (CREATE DATABASE command), and switch the connection to use it (USE command).

Note: the VividCortex guys maintain a nice database/sql tutorial and documentation at http://go-database-sql.org/index.html

答案2

得分: 8

如果您想在程序中创建一个新的数据库(如果不存在),并直接使用它,请注意database/sql维护一个连接池。

因此,打开的数据库连接最好包含数据库名称。我曾经在手动使用db.Exec("USE "+name)后,database/sql打开新连接时遇到过"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
}

希望对您有所帮助!

英文:

If you want to create a new database if it does not exist, and use it directly in your program, be aware that database/sql maintains a connection pool.

Therefore the opened database connection, should preferably contain the database name. I've seen "Error 1046: No database selected" when database/sql opens a new connection after using db.Exec("USE "+name) manually.

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
}

huangapple
  • 本文由 发表于 2015年5月14日 18:29:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/30235031.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定