在我的应用程序的安装脚本中,我正在检查数据库是否包含任何表.如果数据库为空,我想运行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()