ruby 使用ActiveRecord从文件执行SQL语句

q0qdq0h2  于 2023-02-15  发布在  Ruby
关注(0)|答案(1)|浏览(189)

我有一个 *. sql文件,它是自动生成的,包含我的数据库的所有删除和创建信息。
现在我想使用ActiveRecord执行SQL语句:

ActiveRecord::Base.connection.execute File.read( filename )

我得到的错误是

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DROP TABLE IF EXISTS `airports`;

然后是 *. sql文件的完整内容。
然而,如果我只是将 *. sql的内容复制并粘贴到PhpMyAdmin中并在那里执行它,它就可以运行,没有任何问题。
有没有更好的方法?我必须在某处指定mysql版本吗?

xoefb8l8

xoefb8l81#

ActiveRecord::Base.connection.execute清理输入,不允许在一条语句中运行多个查询。
一种解决方法是将文件的内容拆分为单个查询,并独立运行每个查询:

queries = File.read(filename).split(';')
queries.each { |query| ActiveRecord::Base.connection.execute(query) }

更高级的版本将跳过空条件。可能出现空字符串是因为split在最后一个';'。我会跳过这样的空白查询字符串:

queries = File.read(filename).split(';')
queries.each do |query| 
  query.strip!
  ActiveRecord::Base.connection.execute(query) unless query.empty?
end

相关问题