您如何从 Ruby 直接将 SQL 与 MySQL 对话?

Posted

技术标签:

【中文标题】您如何从 Ruby 直接将 SQL 与 MySQL 对话?【英文标题】:How do you talk SQL directly to MySQL from Ruby? 【发布时间】:2008-12-26 21:49:45 【问题描述】:

我想用 Ruby 编写一个脚本来清理同一 mysql 模式的多个副本中的一些混乱键。我想做类似 SHOW CREATE TABLE 之类的事情,然后看看返回的内容并删除键(如果存在)。

我知道在 Rails 环境中你可以这样做...

ActiveRecord::Base.connection.execute( some sql )

但是你得到的是一个“结果”对象。对于这个任务,我需要一个字符串,这样我就可以分析它并采取相应的行动。

【问题讨论】:

【参考方案1】:

这应该可以帮助你:

>> result = ActiveRecord::Base.connection.execute("SHOW TABLES")
=> #<Mysql::Result:0x37ecb30>

>> result.class.instance_methods - Object.instance_methods
=> ["all_hashes", "field_seek", "row_tell", "fetch_field_direct", "free", "field_tell", "fetch_lengths", "num_fields", "data_seek", "fetch_row", "num_rows", "fetch_field", "each", "each_hash", "fetch_hash", "row_seek", "fetch_fields"]

查看 MySql::Result 实例上的#all_hashes

【讨论】:

【参考方案2】:

我会使用 mysql-ruby gem,而你会这样做:

require 'mysql'

m = MySQL.new("localhost", "username", "password", "database")
r = m.query("SELECT * FROM people ORDER BY name")
r.each_hash do |f|
  print "#f['name'] - #f['email']"
end

【讨论】:

【参考方案3】:

您可以查看mysql-ruby gem。

这里有一篇关于如何使用它的文章:Using the Ruby MySQL Module

更多可以通过谷歌找到

【讨论】:

【参考方案4】:

如果你不想使用 ActiveRecord,ORM 对你的使用来说可能有点复杂),你仍然可以使用 ruby​​-mysql 库,或者更好的恕我直言,使用 Ruby DBI/DBD 库(@ 987654321@),它具有开箱即用的 mysql 和 postgresql 的 DBD 驱动程序。

这样,你可以像这样直接发出 SQL 语句

require "dbi"
require "dbi/dbrc"

# == Configuration

DB = "sympa"
HOST = "saphir"

cnt = 0
dup = 0

# == Crude option processing
#
list_name = ARGV.shift.to_s
file = ARGV.shift.to_s

db = DBI::DBRC.new(DB)
DBI.connect(db.dsn + ":#HOST", db.user, db.password) do |dbh|
  date = Time.now.asctime

  if not list_name or list_name == "" then
    puts "List name is mandatory"
    exit 1
  end

  req1 = <<-"EOR"
insert into user_table (email_user,lang_user)
values (?, ?)
  EOR
...
req2 = <<-"EOR"
insert into subscriber_table
(user_subscriber, list_subscriber, visibility_subscriber,
date_subscriber, reception_subscriber) values (?, ?, ?, NOW(), ?)
EOR

sth1 = dbh.prepare(req1)
sth2 = dbh.prepare(req2)
...
#
# Insertion in user_table
#
begin
  sth1.execute(line, "en")
  cnt += 1
rescue DBI::DatabaseError => err
  $stderr.puts("DBI: #err")
end

dbi/dbrc 是一个有用的模块,它使您可以避免将登录名和密码直接放在脚本中。见there。

【讨论】:

【参考方案5】:

可能有更好的方式以编程方式执行此操作,但是如果您真的想驱动交互式命令并解析结果,那么expect 可能更合适。你仍然可以从你的 ruby​​ 脚本中开始期待。

【讨论】:

【参考方案6】:

使用Mysql2

要更新这个帖子:我现在建议使用 Mysql2:http://rubygems.org/gems/mysql2

【讨论】:

以上是关于您如何从 Ruby 直接将 SQL 与 MySQL 对话?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 每个表只导出1000条数据

入门:如何从Linux命令行直接执行MySQL/MariaDB查询

如何将数据库从mysql工作台导出到sql server

直接从 mySQL 数据库训练分类器

如何在 Ruby on Rails 中查看给定 ActiveRecord 查询将生成的 SQL

求助!请问mysql如何快速导入超大的sql文件?