您如何从 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 对话?的主要内容,如果未能解决你的问题,请参考以下文章
入门:如何从Linux命令行直接执行MySQL/MariaDB查询