1

我在文件 my_query.sql 中有以下查询脚本

select * from my_table;
delete from my_other_table where id > 5;
select * from my_other_table;

我正在尝试通过 Ruby 中的“mysql”gem 执行此操作,但遇到了 2 个关键问题

  1. 查询有多个语句,ruby gem 要求我使用 .query(...) 方法一次查询一个。
  2. 查询有多个select语句,gem返回一个hash,所以我不确定它是否会返回多个结果集。

理想情况下,在 unix/bash 中,我可以这样做

mysql my_schema < my_query.sql > my_out_file.txt

这只会一次运行整个脚本(解决问题 #1),并且只会以纯文本形式打印所有 select 语句的结果(解决问题 #2)。

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

注意:我知道我可以退出或使用 system(...) 来执行此操作,但这不是一个可接受的选项。有什么办法可以通过mysql gem(或类似的gem)完成这项工作?

谢谢!

4

2 回答 2

3

我能够得到多个陈述,如下所示。请注意您必须传递它以启用多个语句的标志。

conn  = Mysql2::Client.new(:host     => my_hostname,
                           :database => my_db,
                           :username => my_user, 
                           :password => my_password,
                           :flags    => Mysql2::Client::MULTI_STATEMENTS)
于 2013-10-26T00:43:55.060 回答
2

单独发送每个语句是可以的。它们在 SQL 中是唯一的,因为它们用分号 (" ;") 分隔。

如果多行与您的查询匹配,您将获得一个哈希数组。each您可以使用或者map如果您想转换它们来迭代它们。这是从语言内部访问数据库最常见的事情之一,无论是 Ruby、Python、Perl 还是 Java。

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

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

我们只在工作中使用它,我将它用于我自己的个人代码的所有数据库工作。从自述文件开始了解更多信息。


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

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

如果它们不是都在一行上,您可以尝试使用类似上面的方法,但修改foreach以传入一个新的行尾字符。如果您使用;Ruby,则将分号视为行尾,完整地获取每个 SQL 语句:

File.foreach('sql_queries.sql', ';') do |li|
于 2013-06-16T04:18:34.740 回答