2 回答

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
大多數(shù)針對MySQL運(yùn)行查詢的接口都不支持多查詢。換句話說,它們不允許用分號分隔多個 SQL 語句,每個調(diào)用只支持一個 SQL 語句。
在你的例子中,它返回了一個語法錯誤,因為假設(shè)輸入被解析為單個語句,CREATE DATABASE語句中沒有。USE ...USE
CREATE DATABASE assessment; USE assessment;
這意味著,如果要處理包含許多 SQL 語句的文件,則不能只執(zhí)行正在執(zhí)行的操作,并將整個文件視為一個字符串,以傳遞給以下各項的單個調(diào)用:Exec()
c, ioErr := ioutil.ReadFile("./schema.sql")
sqlScript := string(c)
...
_, err = db.Exec(sqlScript)
必須將該文件的內(nèi)容拆分為單獨(dú)的 SQL 語句,然后循環(huán)訪問這些語句,一次運(yùn)行每個語句。
這比聽起來更復(fù)雜,因為:
SQL 腳本可能包含一個語句,該語句將語句之間的字符從分號更改為其他字符。
DELIMITER
字符串文本或注釋中可能有分號。
某些語句(如 CREATE 過程、CREATE 觸發(fā)器等)可能在例程正文中的語句之間包含分號。您不希望這些分號成為語句的末尾,而是希望將所有內(nèi)容包含在例程定義的末尾。
語句本身不能由MySQL服務(wù)器執(zhí)行。它只控制客戶端。因此,您必須將其視為未發(fā)送到循環(huán)中的服務(wù)器的異常。實際上,還有一堆其他mysql客戶端內(nèi)置命令,如果您在SQL腳本中找到它們,則必須以類似的方式處理它們。
DELIMITER
如果你最終對所有這些邏輯進(jìn)行編碼,那么你基本上已經(jīng)在Go中重新實現(xiàn)了MySQL命令行客戶端。
如果您跳過所有編碼工作,只需使用os.exec.Command運(yùn)行MySQL命令行客戶端,它將更快,更簡單。想想看 - 它將為您節(jié)省數(shù)周的編碼工作,復(fù)制運(yùn)行MySQL客戶端中已經(jīng)實現(xiàn)的SQL腳本的所有細(xì)微差別功能。

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
好吧,所以我決定使用Heroku提供的憑據(jù)直接連接到mysql數(shù)據(jù)庫。
這將返回數(shù)據(jù)庫的 URL。
heroku config | grep CLEARDB_DATABASE_URL
它看起來像這樣:
mysql://alphanum-username:alphanum-password@us-cdbr-iron-east-01.cleardb.net/heroku_alphanum_name?reconnect=true
然后使用主機(jī)從URL連接到它,在本例中是。密碼來自 。mysql -u username -h host -pus-cdbr-iron-east-01.cleardb.netalphanum-password
我運(yùn)行了相同的查詢,但收到此錯誤,這意味著我無法訪問數(shù)據(jù)庫。
ERROR 1044 (42000): Access denied for user 'bbf806af82a4c9'@'%' to database 'assessment'
“正在運(yùn)行”顯示可以作為用戶連接到特定的數(shù)據(jù)庫。show databases;
mysql> SHOW DATABASES;
+------------------------+
| Database |
+------------------------+
| information_schema |
| herokusdfhsdfhsdfsfsdf |
+------------------------+
從這里開始,我運(yùn)行并運(yùn)行了查詢的其余部分,沒有任何問題。USE herokusdfhsdfhsdfsfsdf
- 2 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報