我在文件my_query.sql
中有以下查询脚本select * from my_table;
delete from my_other_table where id > 5;
select * from my_other_table;
我试图通过Ruby中的'mysql'gem执行此操作我遇到了两个关键问题
理想情况下,在unix / bash中,我可以做到
mysql my_schema < my_query.sql > my_out_file.txt
这将立即运行整个脚本(解决问题#1),并且只打印所有select语句的结果作为纯文本(解决问题#2)。
Ruby是否有类似的选项来运行查询文件并将整个输出转储到文件中?
注意:我知道我可以使用系统(...)来执行此操作,但这不是一个可接受的选项。我可以通过mysql gem(或类似的gem)完成任务吗?
谢谢!
答案 0 :(得分:2)
单独发送每个声明都没问题。它们在SQL中是唯一的,因为它们以分号分隔(“;
”)。
如果多行符合您的查询,您将获得一系列哈希值。如果要对其进行转换,可以使用each
或map
对其进行迭代。这是从语言内部访问数据库最常见的事情之一,无论是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)