【问题标题】:Cannot execute MySQL sql "source" command from Rake task using ActiveRecord无法使用 ActiveRecord 从 Rake 任务执行 MySQL sql "source" 命令
【发布时间】:2012-02-10 14:03:29
【问题描述】:

我编写了一个存储过程,并希望在 Rake 任务中执行它。

在调用存储过程之前(通过“call”语句),我应该使用由于以下错误而失败的源命令创建过程:

Mysql2::Error: 你的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在第 1 行的“源 import_legacy_database.sql”附近​​使用:源 import_legacy_database.sql

执行以下行时会发生此错误:

ActiveRecord::Base.connection.execute "source import_legacy_database.sql"

相同的命令“source import_legacy_database.sql”在控制台中运行良好,但在 Rake 任务中运行良好。

如果我不调用该命令,那么

ActiveRecord::Base.connection.execute "call import_legacy_database()"

失败,因为数据库找不到过程,因为它不存在。

提前致谢。

【问题讨论】:

    标签: mysql ruby-on-rails stored-procedures rake


    【解决方案1】:

    我终于用了sh Rake方法,批量执行sql命令http://dev.mysql.com/doc/refman/5.5/en/batch-mode.html

    sh "mysql -u root mydb_development -e 'source import_legacy_database.sql'"
    

    【讨论】:

    • 如果您的应用服务器和数据库服务器在同一台机器上,这很好,但在大多数生产环境中,当它们不在同一台机器上时,此方法将不起作用。
    【解决方案2】:

    我相信这是因为source 命令特定于MySQL 命令行客户端的实现,而不是ActiveRecord 实现的API 的一部分。例如,如果您尝试在 ActiveRecord 中使用 DELIMITER 命令,也会发生同样的事情。

    【讨论】:

    • 有没有其他方法可以在 Rake 任务中执行 sql 语句?
    • @negarnil 实际上我不确定。我搜索了一下,但没有找到答案。我想你可以用 Ruby 代码加载文件,然后在 SQL 分隔符上拆分它以执行每个结果部分。
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多