繁体   English   中英

使用Ruby / MySQL构造有效的MySQL查询

[英]Construct a valid MySQL query using Ruby/MySQL

如果使用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'),
    )
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

在这种情况下,我将使用join,而不是循环并每次添加一个逗号,请执行以下操作:

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

当然,您首先需要将哈希值转换为包含您感兴趣的元素的数组! 尝试这个:

(res.each_hash{|row| "(#{row["name"]}, #{row["category"]})"}).join(",")

一种方法是:

    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)

通常,如果您不想只使用任何Ruby魔术(如.join()),则可以按索引循环遍历数组/哈希,并且如果不是最后一个元素,则仅添加逗号:

  if(index < array.length) string << ",\n"

感谢所有的建议。 以本·休斯(Ben Hughes)为例,这里是“散列”版本:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM