Postgresql 直接从文件或字符串执行Go中的SQL脚本

Postgresql 直接从文件或字符串执行Go中的SQL脚本,postgresql,go,Postgresql,Go,在我的应用程序安装脚本中,我正在检查db是否包含任何表。如果数据库是空的,我有DML和DDLSQL脚本要运行 它从一个单独的.SQL文件中读取SQL并不重要,所以现在我只是将它直接放入两个字符串中—一个用于DDL,一个用于DML—并将它们连接起来 我现在的问题是,我现在在尝试运行脚本以生成表并使用.Exec(sqlStr)将数据插入其中时遇到了此错误: 我当然可以解决这个问题。比如: sqlStr := sqlDML + sqlDDL sqlStmtSlice := strings.Split(

在我的应用程序安装脚本中,我正在检查db是否包含任何表。如果数据库是空的,我有DML和DDLSQL脚本要运行

它从一个单独的.SQL文件中读取SQL并不重要,所以现在我只是将它直接放入两个字符串中—一个用于DDL,一个用于DML—并将它们连接起来

我现在的问题是,我现在在尝试运行脚本以生成表并使用.Exec(sqlStr)将数据插入其中时遇到了此错误:

我当然可以解决这个问题。比如:

sqlStr := sqlDML + sqlDDL
sqlStmtSlice := strings.Split(sqlStr, ";")
for i:= 0; i < len(sqlStmtSlice) i++ {
    // Exec() each individual statement!
}

据我所知,如果不允许多个语句查询,没有一个真正更好的方法。这与您正在使用的驱动程序无关,因为这是一个
数据库/sql
包限制。争论它是否是一个好的设计是另一个问题(我相信已经有很多了)

在备选方案方面,您可能会使用SQL模式迁移工具,或者从中获得灵感。一般的惯例是使用一个语义上不活跃的标记,如注释,并围绕论文进行分割

有关golang的示例,您可以看到:

  • :功能齐全,可以用Go编写迁移
  • :轻量级,仅限SQL

免责声明:我是rambler的开发者。这就是说,你肯定应该看看鹅,它真的很酷。

一段时间以来一直在努力解决同样的问题。我需要它的原因稍有不同(在运行测试之前初始化数据库)

正如Elwinar已经提到的,
数据库/sql
包不允许这样做。我克服这个问题的方法是创建一个python脚本(我们称之为
sql\u runner.py
),它执行一个文件,然后运行go exec命令来执行python脚本(别忘了让它可执行)

因此,需要一个python命令来运行sql文件:
cursor.execute(open(“setting\u up.sql”),“r”).read())

和运行此文件的Go代码的一部分:

cmd := exec.Command("sql.py")

cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
log.Println(cmd.Run())

兰布拉的死链接。嗯……不。Github存储库仍然存在…。但是Github昨天发生了一次生产事件,一整天都存在数据库一致性问题。
tx, err := db.Begin()

sqlStr := fmt.Sprintf(sqlDML + sqlDDL)
sqlStmtSlice := strings.Split(sqlStr, ";\r")

if err != nil {
    return err
}

defer func() {
    _ = tx.Rollback()
}()

for _, q := range sqlStmtSlice {
    _, err := tx.Exec(q)

    if err != nil {
        return err
    }
}

err = tx.Commit()
cmd := exec.Command("sql.py")

cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
log.Println(cmd.Run())