pythonでPostgreSQLのデータをmongodbへ移行する

また昨日の続き。いままで受け取ってきたデータはPostgreSQLに入っているので、これをmongodbへ移してあげます。psycopgで読み込んで、これをディレクトリへ変換して投入。
psycopgでselectしてフェッチされたデータはタプルに格納されているので、一旦リストへ変換した上で、dict(),zip()でディレクトリへ変換。

また、postgreSQL中に入っている日付型や時間型のデータオブジェクトは

datetime.date(2009,12,31)

てな具合でselectされてくるので、これは文字列へ変換。

#!/usr/bin/python

import pymongo
import psycopg2
import datetime

def conv_date(data_tuple):
    data_list = list(data_tuple)                            #タプルをリストへ変換
    data_list[2] = data_list[2].strftime("%Y%m%d")   #日付を文字列へ変換
    data_list[3] = data_list[3].strftime("%H%M")      #時間を文字列へ変換
    return(data_list)
title = ('hogehoge',      
          'fugafuga',
          'date',
          'time',
          'mogamoga')

mongo_conn = pymongo.Connection()
db = mongo_conn["test"]
collection = db["foo"]

conn = psycopg2.connect("dbname=testdb user=postgres")
cur = conn.cursor()
cur.execute("select * from data_tbl;")

r = cur.fetchone()
collection.insert(dict(zip(title,conv_date(r))))

while ( r != None ):
    conv_date(r)
    collection.insert(dict(zip(title,conv_date(r))))

cur.close()
conn.close()
mongo_conn.close()

一行目と二行目以降の処理が分割してしまっているのが非常にダサい。
しかも実際に動かしてみると、途中でこんなエラーが。

Wed Jun  1 16:46:06 [conn26]      mmap failed with out of memory, if you're using 32-bits, then you probably need to upgrade to 64

データそんなに多くないんだけどな。なんとかしなきゃ。