代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

ActiveRecord::Base.connection.execute一次是否只执行一条语句?

  •  2
  • Benjamin Oakes  · 技术社区  · 15 年前

    sql = "statement_1; statement_2; statement_3; etc;"
    ActiveRecord::Base.connection.execute(sql)
    

    或者使用换行符,就像这样:

    sql = <<EOF
    statement_1;
    statement_2;
    statement_3;
    etc;
    EOF
    ActiveRecord::Base.connection.execute(sql)
    

    (显然,这些语句只是占位符,但根据我的测试,我认为它们的内容并不重要。)

    我希望 documentation on execute 会有一些启发,但除了使用单数(“语句”),它不会。也许是因为我使用的数据库引擎(作为参考,我目前正在使用SQLite。)

    我最后写了一个方法,它可以实现以下功能:

    def extract_sql_statements(sql)
      statements = []
    
      sql.split(';').each do |statement|
        statement.strip!
    
        unless statement.empty?
          statement += ';'
          statements << statement
        end
      end
    
      return statements
    end
    

    statements . 它解决了这个问题,但如果有更优雅的解决方案,我会有兴趣听到他们。

    1 回复  |  直到 15 年前
        1
  •  1
  •   nas    15 年前

    如果您查看rails代码,就会发现execute方法运行传递的sql,因此它应该基本上运行所有查询,只要它们是“;”分开且有效。

    编辑:对不起!不,不会,因为它会加上“;”在查询字符串和抱怨语法错误之间