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操作が簡単になる可能性があります。これは、列名をそれらの値にマップするハッシュを使用してブロックを呼び出します。

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) }
于 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 に答える