我正在尝试使用 capistrano 来运行 mysql 命令。
如果我运行,在我的本地终端
mysql -u <username> -p <password> -h <server ip> <database name>
它连接到 mysql 并准备好接受命令。
但是如果我在 capistrano 任务中运行它....
execute "mysql -u <username> -p <password> -h <server ip> <database name>"
如果运行没有失败,就卡在那里。这是否意味着它已连接并等待命令?如果是这样,我将如何提供命令?
最佳答案
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 提供了 --execute
和 STDIN
选项,因此最好使用它们。
关于mysql - 使用 Capistrano 运行 mySql 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26736977/