我有以下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数据库?
答案 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程序员那样派对。
您还可以使用prepare
和exec_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)
# 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)