从单独的.sql文件中读取sql并不重要,所以现在我只是把它直接放到两个字符串中 – 一个用于DDL,一个用于DML – 并连接它们.
我现在的问题是,当我尝试运行脚本生成表并使用.Exec(sqlStr)将数据插入其中时,我现在遇到此错误:
"pq: cannot insert multiple commands into a prepared statement"
我当然可以做一个解决方法.就像是:
sqlStr := sqlDML + sqlDDLsqlStmtSlice := 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
免责声明:我是漫步者的开发者.也就是说,你应该明确看看鹅,这真的很酷.
总结以上是内存溢出为你收集整理的postgresql – 直接从文件或字符串中执行Go中的SQL脚本全部内容,希望文章能够帮你解决postgresql – 直接从文件或字符串中执行Go中的SQL脚本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)