【发布时间】:2012-08-15 13:45:38
【问题描述】:
我正在将 Ruby on Rails 与 ActiveRecord 和 PostgreSQL 结合使用。
如何执行多个 sql 查询?
我需要它来运行自定义迁移脚本,例如:
Foo.connection.execute <<-SQL.split(';').map(&:strip).join
delete from metadata where record_type = 'Foo';
TRUNCATE table1 RESTART IDENTITY;
TRUNCATE table2 RESTART IDENTITY;
delete from schema_migrations where version > '20120806120823';
SQL
我不接受来自用户的数据,所以我不担心 sql 注入。
在 MySQL 中可能是 CLIENT_MULTI_STATEMENTS 之类的东西?
来自 MySQL/PHP 文档:
CLIENT_MULTI_STATEMENTS:告诉服务器客户端可以发送 单个字符串中的多个语句(用“;”分隔)。如果这 未设置标志,禁用多语句执行。见 有关此标志的更多信息,请注意此表。
【问题讨论】:
-
我认为在实际示例中,您正在从文件中读取脚本,因此您不能像示例中那样对每个语句循环一次
execute而不进行狡猾的字符串拆分?如果它直接在您的代码中,您可以将语句放在一个数组中并循环它。 -
希望编辑准确反映您的意图。如果没有,请告诉我 - 或重新编辑。
-
就像 Craig Ringer 所说的那样 - 简单地多次调用
connection.execute并且每次只有一个语句有什么问题?我已经这样做了很多次(有一次,在 Rails 应用程序中第一次迁移时,运行包含数十个表的遗留 SQL 模式转储)。 -
不想进行多个网络调用。这就是我现在正在做的事情。在这种情况下,网络调用在网络上非常慢,但我可以忍受它进行删除和截断。问这个问题主要是想知道。
标签: ruby-on-rails ruby ruby-on-rails-3 postgresql activerecord