2 回答
TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
大多數(shù)針對(duì)MySQL運(yùn)行查詢的接口都不支持多查詢。換句話說,它們不允許用分號(hào)分隔多個(gè) SQL 語句,每個(gè)調(diào)用只支持一個(gè) SQL 語句。
在你的例子中,它返回了一個(gè)語法錯(cuò)誤,因?yàn)榧僭O(shè)輸入被解析為單個(gè)語句,CREATE DATABASE語句中沒有。USE ...USE
CREATE DATABASE assessment; USE assessment;
這意味著,如果要處理包含許多 SQL 語句的文件,則不能只執(zhí)行正在執(zhí)行的操作,并將整個(gè)文件視為一個(gè)字符串,以傳遞給以下各項(xiàng)的單個(gè)調(diào)用:Exec()
c, ioErr := ioutil.ReadFile("./schema.sql")
sqlScript := string(c)
...
_, err = db.Exec(sqlScript)
必須將該文件的內(nèi)容拆分為單獨(dú)的 SQL 語句,然后循環(huán)訪問這些語句,一次運(yùn)行每個(gè)語句。
這比聽起來更復(fù)雜,因?yàn)椋?/p>
SQL 腳本可能包含一個(gè)語句,該語句將語句之間的字符從分號(hào)更改為其他字符。
DELIMITER字符串文本或注釋中可能有分號(hào)。
某些語句(如 CREATE 過程、CREATE 觸發(fā)器等)可能在例程正文中的語句之間包含分號(hào)。您不希望這些分號(hào)成為語句的末尾,而是希望將所有內(nèi)容包含在例程定義的末尾。
語句本身不能由MySQL服務(wù)器執(zhí)行。它只控制客戶端。因此,您必須將其視為未發(fā)送到循環(huán)中的服務(wù)器的異常。實(shí)際上,還有一堆其他mysql客戶端內(nèi)置命令,如果您在SQL腳本中找到它們,則必須以類似的方式處理它們。
DELIMITER
如果你最終對(duì)所有這些邏輯進(jìn)行編碼,那么你基本上已經(jīng)在Go中重新實(shí)現(xiàn)了MySQL命令行客戶端。
如果您跳過所有編碼工作,只需使用os.exec.Command運(yùn)行MySQL命令行客戶端,它將更快,更簡(jiǎn)單。想想看 - 它將為您節(jié)省數(shù)周的編碼工作,復(fù)制運(yùn)行MySQL客戶端中已經(jīng)實(shí)現(xiàn)的SQL腳本的所有細(xì)微差別功能。
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
好吧,所以我決定使用Heroku提供的憑據(jù)直接連接到mysql數(shù)據(jù)庫(kù)。
這將返回?cái)?shù)據(jù)庫(kù)的 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)行了相同的查詢,但收到此錯(cuò)誤,這意味著我無法訪問數(shù)據(jù)庫(kù)。
ERROR 1044 (42000): Access denied for user 'bbf806af82a4c9'@'%' to database 'assessment'
“正在運(yùn)行”顯示可以作為用戶連接到特定的數(shù)據(jù)庫(kù)。show databases;
mysql> SHOW DATABASES;
+------------------------+
| Database |
+------------------------+
| information_schema |
| herokusdfhsdfhsdfsfsdf |
+------------------------+
從這里開始,我運(yùn)行并運(yùn)行了查詢的其余部分,沒有任何問題。USE herokusdfhsdfhsdfsfsdf
- 2 回答
- 0 關(guān)注
- 140 瀏覽
添加回答
舉報(bào)
