你如何从Ruby直接与MySQL谈论SQL?

时间:2008-12-26 21:49:45

标签: sql mysql ruby-on-rails ruby activerecord

我想在Ruby中编写一个脚本来清理同一个MySQL模式的几个副本中的一些混乱的密钥。我想做一些像SHOW CREATE TABLE之类的东西,然后查看返回的内容并删除密钥(如果它们存在)。

我知道在Rails环境中你可以做到这一点......

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

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

6 个答案:

答案 0 :(得分:10)

这可以帮到你:

>> 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

答案 1 :(得分:8)

我会使用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

答案 2 :(得分:4)

如果您不想使用ActiveRecord,ORM现在可能对您的使用有点复杂),您仍然可以使用ruby-mysql库,甚至更好的IMHO是使用Ruby DBI / DBD库({ {3}})有mysql&amp;的DBD驱动程序postgresql开箱即用。

这样,您可以发出像这样的直接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是一个非常有用的模块,可以避免将登录名和密码直接放在脚本中。请参阅here

答案 3 :(得分:4)

您可以查看mysql-ruby gem。

以下是关于如何使用它的文章:Using the Ruby MySQL Module

可以通过谷歌找到更多

答案 4 :(得分:1)

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

答案 5 :(得分:0)

使用Mysql2

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