在我的應用程序的安裝腳本中,我正在檢查db是否包含任何表。如果數據庫是空的,我想運行DML和DDL SQL腳本。在文件或字符串中直接執行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腳本並執行整個批處理必須有更好的方法,對吧?你知道嗎?
詩篇。我正在使用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()