我想在Ruby中编写一个脚本来清理同一个MySQL模式的几个副本中的一些混乱的密钥。我想做一些像SHOW CREATE TABLE之类的东西,然后查看返回的内容并删除密钥(如果它们存在)。
我知道在Rails环境中你可以做到这一点......
ActiveRecord::Base.connection.execute( some sql )
但你得到的是一个“结果”对象。对于这个任务,我需要一个字符串,以便我可以分析它并采取相应的行动。
答案 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)
答案 4 :(得分:1)
可能有更好的方法以编程方式执行此操作,但是如果您确实想要驱动交互式命令并解析结果,那么expect可能更合适。你仍然可以从ruby脚本中开始期待。
答案 5 :(得分:0)
更新这个帖子:我现在建议使用Mysql2:http://rubygems.org/gems/mysql2