加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:58:36 所属栏目:百科 来源:网络整理
导读:在我的应用程序的安装脚本中,我正在检查数据库是否包含任何表.如果数据库为空,我想运行DML和DDL SQL脚本. 从单独的.sql文件中读取SQL并不重要,所以现在我只是把它直接放到两个字符串中 – 一个用于DDL,一个用于DML – 并连接它们. 我现在的问题是,当我尝试运
在我的应用程序的安装脚本中,我正在检查数据库是否包含任何表.如果数据库为空,我想运行DML和DDL SQL脚本.

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

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

"pq: cannot insert multiple commands into a prepared statement"

我当然可以做一个解决方法.就像是:

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

但是,我不确定我是否喜欢这种方法.当然,必须有更好的方法从文件加载SQL脚本并执行整批,对吧?你知道吗?

PS.我正在使用Go的PostgreSQL驱动程序,但我认为这没有任何区别.

编辑:

由于当时似乎没有更好的解决方案来完成这项工作,我对上面的伪代码做了一些改进,经过测试并且似乎工作得很好:

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

解决方法

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

在备选方面,您可以使用SQL模式迁移工具或使用它们的灵感.一般惯例是使用语义惰性标记,例如注释,并围绕这些标记分开.

对于golang中的示例,您可以看到:

> goose:全功能,迁移可以用Go编写
> rambler:轻量级,仅限SQL

免责声明:我是漫步者的开发者.也就是说,你应该明确看看鹅,这真的很酷.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读