如何将数组插入数据库表?

时间:2012-04-27 17:56:23

标签: mysql ruby postgresql pg

我有以下Ruby代码:

 94   def open_connection(info)
 95     self.log "opening #{info.inspect}"
 96     db = Mysql.init
 97     db.options(Mysql::SET_CHARSET_NAME, 'utf8')
 98     db.real_connect(info.host, info.user, info.password, info.dbname, info.port)
 99     db.query("SET NAMES utf8")
100 »···res = db.query("SELECT realname FROM profiles")
101 
102 »···conn = PGconn.connect("localhost", 5432, '', '', "dbname", "user", "pwd")

如何获取res变量并循环将其插入Postgres数据库?

2 个答案:

答案 0 :(得分:3)

MySQL query方法为您提供了一个Mysql::Result实例,因此您可以使用each将每一行作为数组:

res = db.query('select realname from profiles')
res.each do |a|
    # a is an array of strings
    realname = a.first
    # ...
end

如果结果集中有更多列,那么each_hash可能更容易使用,它会使用Hash调用块,它将列名映射到它们的值。

要将数据插入PostgreSQL,请使用exec

pg_conn.exec('insert into some_table (some_column) values ($1)', [ realname ])

请使用占位符而不是插值,不需要像1999年的PHP程序员那样派对。

您还可以使用prepareexec_prepared

pg_conn.prepare('ins', 'insert into some_table (some_column) values ($1)')
pg_conn.exec_prepared('ins', [ realname1 ])
pg_conn.exec_prepared('ins', [ realname2 ])
# ...

如果你要一遍又一遍地执行相同的SQL,prepare方法会更好。

将它们结合起来完成工作:

res = db.query('select realname from profiles')
pg_conn.prepare('ins', 'insert into some_table (some_column) values ($1)')
res.each { |a| pg_conn.exec_prepared('ins', a) }

答案 1 :(得分:2)

使用Sequel数据库库,您可以使用import

# When `res` is an array of just values
res = MYSQLDB[:profiles].select_map(:realname)
PGDB[:profiles].import([:realname],res)

...或者您可以使用multi_insert

# When `res` is an array of hashes mapping column name to value
res = MYSQLDB[:profiles].select(:realname).all
PGDB[:profiles].multi_insert(res)

使用上述任何一种方法,你可以选择传递一个最后一个参数,并带有批量插入的选项(可能会使用更少的内存,因此效果更高):

PGDB[:profiles].import([:realname],res,commit_every:500)
PGDB[:profiles].multi_insert(res,commit_every:500)