Создайте действительный запрос MySQL, используя Ruby / MySQL - PullRequest
2 голосов
/ 10 июля 2009

Если я использую библиотеку Ruby / MSQL, я вернул объект типа Mysql :: Result, как мне создать строку, которая проходит через объект и создает допустимый запрос MySQL? У меня возникают проблемы с выяснением того, как отбросить последнюю запятую из приведенного ниже вывода, и как передать этот вывод обратно в метод query ().

require 'mysql'
dbh = Mysql.real_connect("host", "user", "pass", "db")
res = dbh.query("SELECT name, category FROM animals")
printf "INSERT INTO animals (name, category) VALUES (\n"
res.each_hash do |row|
printf "('%s', '%s'),\n", row["name"], row["category"]
end
printf ")\n"

#Output    
INSERT INTO animals (name, category) VALUES (
    ('snake', 'reptile'),
    ('frog', 'amphibian'),
    ('tuna', 'fish'),
    ('raccoon', 'mammal'),
    )

Ответы [ 5 ]

3 голосов
/ 10 июля 2009
values = []
res.each_row do |r|
  values << "(#{r.map{|x| dbh.quote(x) }.join(", ")})"
end
query =<-SQL
  INSERT INTO animals(name, category) VALUES
    (#{values.join(",\n")}
    )
SQL

puts query
2 голосов
/ 10 июля 2009

В этом случае я бы использовал объединение, поэтому вместо того, чтобы зацикливаться и каждый раз добавлять запятую, делайте что-то вроде:

["One", "Two", "Three"].join(',')

Вам, конечно, нужно сначала превратить ваш хеш в массив, содержащий элементы, которые вас интересуют! Попробуйте это:

(res.each_hash{|row| "(#{row["name"]}, #{row["category"]})"}).join(",")
1 голос
/ 10 июля 2009

в общем, если вы не хотите использовать какую-либо магию Ruby (например, .join ()), вы можете просто перебрать массив / хэш по индексу и добавить запятую, только если это не последний элемент: 1001 *

  if(index < array.length) string << ",\n"
1 голос
/ 10 июля 2009

Один из способов сделать это будет:

    require 'mysql'    
    dbh = Mysql.real_connect("host", "user", "pass", "db")    
    res = dbh.query("SELECT name, category FROM animals")   
    stmt = "INSERT INTO animals (name, category) VALUES ("    
    res.each_hash do |row|
        stmt << "(#{row["name"]}, #{row["category"]})"  
    end    
    stmt << ")"

"как передать этот вывод обратно методу query ()"

     dbh.query(stmt)
0 голосов
/ 11 июля 2009

Спасибо за все предложения. На примере Бена Хьюза приведена версия с хешированием:

values = []
res.each_hash do
  |row| values << "('#{row.map{|d,x| dbh.quote(x) }.join("', '")}')" 
  end
puts values.join(",")

query="INSERT INTO animals (name, category) VALUES #{values.join(", ")}"
dbh.query(query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...