Как вы говорите SQL напрямую с MySQL из Ruby? - PullRequest
7 голосов
/ 27 декабря 2008

Я хочу написать скрипт на Ruby, чтобы очистить некоторые испорченные ключи в нескольких копиях одной и той же схемы MySQL. Я хотел бы сделать что-то вроде SHOW CREATE TABLE, затем посмотреть, что возвращается, и удалить ключи, если они существуют.

Я знаю, что в среде Rails вы можете сделать это ...

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

Но то, что вы получаете, это объект "Результат". Для этой задачи мне нужна строка, чтобы я мог проанализировать ее и действовать соответственно.

Ответы [ 6 ]

10 голосов
/ 08 января 2009

Это должно помочь вам:

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

Посмотрите #all_hashes в экземпляре MySql :: Result

8 голосов
/ 27 декабря 2008

Я бы использовал gem mysql-ruby, а вы бы сделали что-то вроде этого:

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
4 голосов
/ 27 декабря 2008

Вы можете проверить камень mysql-ruby .

Вот описание того, как его использовать: Использование Ruby MySQL Module

Больше можно найти через Google

4 голосов
/ 27 декабря 2008

Если вы не хотите использовать ActiveRecord, ORM может быть немного сложнее для вашего использования сейчас), вы все равно можете использовать библиотеку ruby-mysql или, что еще лучше, ИМХО использовать библиотеку Ruby DBI / DBD ( здесь ), который имеет драйверы DBD для mysql и 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 - это полезный модуль, позволяющий избежать ввода логина и пароля непосредственно в скрипт. См там .

1 голос
/ 27 декабря 2008

Вероятно, есть лучший способ сделать это программно, однако, если вы действительно хотите управлять интерактивными командами и анализировать результаты, тогда ожидается, что может быть более подходящим Вы все еще можете начать ожидать от своего сценария ruby.

0 голосов
/ 28 марта 2013

Использовать Mysql2

Чтобы обновить эту тему: я бы предложил Mysql2 сейчас: http://rubygems.org/gems/mysql2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...