2014-11-04 39 views
1

我正在嘗試使用capistrano運行mysql命令。使用Capistrano運行mySql命令

在我的本地termainal如果我運行

mysql -u <username> -p <password> -h <server ip> <database name> 

它連接到MySQL和準備命令。

但是,如果我在一個Capistrano的任務運行此....

如果沒有失敗,只是運行掛起那裏。這是否意味着它已連接並等待命令?如果是的話,我將如何提供命令?

+0

你期望能夠交互地使用它,還是隻有一個命令來執行? '-e'SELECT * FROM tbl''命令行選項將運行一個。 – 2014-11-04 14:00:03

+0

@MichaelBerkowski我有幾個SQL查詢,我想運行,這些SQL查詢將被硬編碼在任務文件中。你認爲它掛起的事實意味着它已經準備好接受命令了嗎? – 2014-11-04 14:02:40

+1

看起來像它,但我不知道它是有用的。我剛剛建立了一個SSH連接,並啓動了一個mysql提示符,如'ssh localhost mysql -ppasswd dbname',但沒有返回輸出,但是我的命令沒有完成。然後我輸入'SELECT COUNT(*)FROM tbl;',直到我做了'ctl-d',仍然沒有輸出。之後,顯示我的查詢結果,並返回我的提示。 – 2014-11-04 14:06:25

回答

1

mysql命令行客戶端有幾種不同的方法在命令行上提供查詢。它可以與--execute/-e標誌一樣接受他們:

mysql --execute 'SELECT * FROM tbl' --user=user dbname 

或者也可以通過管道或文件重定向從STDIN接受他們:

echo 'SELECT * FROM tbl' | mysql --user=user dbname 
# Or: 
mysql --user=user dbname < file_containing_queries.sql 

對於Capistrano的應用程序,通過--execute執行他們應該很好地工作。您可以使用分號分隔多個語句,但一定要正確引用所有內容。全套SQL語句應該是一個帶引號的字符串。

# In a Capistrano task: 
execute "mysql -e'SELECT * FROM tbl1; SELECT * FROM tbl2;' -u <username> -p <password> -h <server ip> <database name>" 

這可能是一個良好的使用Ruby的替代%q/%Q的報價,以避免引用字符串文字中的SQL語句中的問題:

execute %q{mysql -e"SELECT * FROM tbl1 WHERE col='value'; SELECT * FROM tbl2 WHERE col='value';" -u user -ppasswd -hhost dbname} 

當通過在Capistrano的SSH啓動mysql客戶端,它看來,客戶端在服務器上加載並接受語句,但以交互方式提供它們會相當困難。由於這個原因,MySQL提供--executeSTDIN選項,所以最好使用它們。