使用Ruby中的Mysql gem运行脚本(多个语句)

时间:2013-06-16 04:06:01

标签: mysql ruby

我在文件my_query.sql

中有以下查询脚本
select * from my_table;
delete from my_other_table where id > 5;
select * from my_other_table;

我试图通过Ruby中的'mysql'gem执行此操作我遇到了两个关键问题

  1. 查询有多个语句,ruby gem要求我使用.query(...)方法一次查询一个。
  2. 查询有多个select语句,gem返回一个哈希,所以我不确定它是否会返回多个结果集。
  3. 理想情况下,在unix / bash中,我可以做到

    mysql my_schema < my_query.sql > my_out_file.txt
    

    这将立即运行整个脚本(解决问题#1),并且只打印所有select语句的结果作为纯文本(解决问题#2)。

    Ruby是否有类似的选项来运行查询文件并将整个输出转储到文件中?

    注意:我知道我可以使用系统(...)来执行此操作,但这不是一个可接受的选项。我可以通过mysql gem(或类似的gem)完成任务吗?

    谢谢!

2 个答案:

答案 0 :(得分:2)

单独发送每个声明都没问题。它们在SQL中是唯一的,因为它们以分号分隔(“;”)。

如果多行符合您的查询,您将获得一系列哈希值。如果要对其进行转换,可以使用eachmap对其进行迭代。这是从语言内部访问数据库最常见的事情之一,无论是Ruby,Python,Perl还是Java。

我强烈建议您考虑使用Sequel gem作为数据库的接口。它是一个ORM,充当代码与SQL和DBM之间的良好接口层。您可以以编程方式编写查询,这是一个很大的胜利。您不必编写SQL,而是让Sequel为您生成查询。根据我的经验,它可以很好地编写高效的代码;你必须竭尽全力让它做错事。

它为表带来的第二件事是从其他DBM类型(从SQLite到PostgreSQL或Oracle)以及其他一些DBM类型之间迁移的非常简单的途径。

我们在工作中专门使用它,并且我将它用于我的所有数据库工作以用于我自己的个人代码。从Readme开始了解详情。


如果您的所有查询都在一行上,您可以使用:

File.foreach('sql_queries.sql') do |li|
  puts li
end

如果它们不在一行上,您可以尝试使用上述内容,但修改foreach以传入新的行尾字符。如果使用; Ruby会将分号视为行的结尾,完整地抓取每个SQL语句:

File.foreach('sql_queries.sql', ';') do |li|

答案 1 :(得分:2)

我能够获得如下多个语句。请注意您必须传递的标志才能启用多个语句。

conn  = Mysql2::Client.new(:host     => my_hostname,
                           :database => my_db,
                           :username => my_user, 
                           :password => my_password,
                           :flags    => Mysql2::Client::MULTI_STATEMENTS)