3

我有以下 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 数据库?

4

2 回答 2

3

MySQLquery方法为您提供了一个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 程序员那样聚会。

您还可以使用prepareand 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 ])
# ...

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

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

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) }
于 2012-04-27T18:40:20.583 回答
2

使用Sequel DB 库,您可以使用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)
于 2012-04-27T18:45:46.120 回答