如何在Golang中使用命令执行SQL文件

ds97pgxw  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(255)

我有一个sql文件(database.sql),在启动我的服务器之前,我想执行一些命令,它看起来是这样的

CREATE TABLE forums (
  id BIGSERIAL primary key,
  slug TEXT NOT NULL UNIQUE,
  title TEXT,
  author TEXT references users(login),
  threads BIGINT DEFAULT 0,
  posts BIGINT DEFAULT 0
);

我知道,我应该使用db.Exec(request),但我有很多请求(“CREATETABLE user”和其他……)
我不知道怎么做
帮助,非常感谢!

ogq8wdun

ogq8wdun1#

您可以将文件的内容读入字符串并将其传递给Exec

query, err := ioutil.ReadFile("path/to/database.sql")
if err != nil {
    panic(err)
}
if _, err := db.Exec(query); err != nil {
    panic(err)
}

如果你的database.sql是以这种方式格式化的,或者它包含了破坏db.Exec的查询,那么你可以将os/execpsql一起使用(如果它安装在运行代码的机器上)。

cmd := exec.Command("psql", "-d", "database_name", "-f", "path/to/database.sql")
stderr, err := cmd.StderrPipe()
if err != nil {
    panic(err)
}

if err := cmd.Start(); err != nil {
    panic(err)
}

errout, _ := ioutil.ReadAll(stderr)
if err := cmd.Wait(); err != nil {
    fmt.Println(errout)
    panic(err)
}

如果文件中有多个SQL语句,请不要忘记将MultiStatements设置为true。示例:

config := mysql.Config{
    User:                 "User",
    Passwd:               "Password",
    Net:                  "tcp",
    Addr:                 "127.0.0.1:3306",
    DBName:               "DB_Name",
    MultiStatements:      true,
}

var err error
DB, err = sql.Open("mysql", config.FormatDSN())
if err != nil {
    log.Fatal(err)
    return err
}

相关问题