PythonとPostgresが単一のトランザクションで複数のデータセットを挿入するときのトランザクションと一括挿入の処理方法を理解する必要があります。 環境:名前付き変数と一括挿入を使用するpostgresを使用したPython
- のWindows 7 64ビット
- のPython 3.2
- Postgresqlの9.1
- psycopg2
私のシナリオは次のとおりです。私はXMLに1つのデータベース(オラクル)からのデータを変換しています そのデータを新しいデータベース(ポストグル)に挿入します。これは大きなデータセットなので、私はいくつかのインサートを最適化しようとしています。このデータの多くはライブラリタイプのオブジェクトを考慮しているので、ライブラリテーブルがあり、次にxmlメタデータとXMLコンテンツのテーブルがあり、このデータのフィールドはデータベースのテキストタイプです。私はoracleからデータを取り出し、挿入する必要のあるデータの辞書を作成しています。私は3つの挿入ステートメントを持っています。最初の挿入は、シリアルIDを使用してライブラリテーブルにレコードを作成し、そのIDはメタデータとコンテンツテーブルにxmlを挿入する次の2つのクエリの関係に必要です。私は最初のクエリを実行したときに私が持っている問題がある
for inputKey in libDataDict.keys():
metaString = libDataDict[inputKey][0]
contentString = libDataDict[inputKey][1]
insertLibDataList.append({'objIdent':"%s" % inputKey, 'objName':"%s" % inputKey, objType':libType})
insertMetadataDataList.append({'objIdent':inputKey,'objMetadata':metaString})
insertContentDataList.append({'objIdent':inputKey, 'objContent':contentString})
dataDict['cmsLibInsert'] = insertLibDataList
dataDict['cmsLibMetadataInsert'] = insertMetadataDataList
dataDict['cmsLibContentInsert'] = insertContentDataList
sqlDict[0] = {'sqlString':"insert into cms_libraries (cms_library_ident, cms_library_name, cms_library_type_id, cms_library_status_id) \
values (%(objIdent)s, %(objName)s, (select id from cms_library_types where cms_library_type_name = %(objType)s), \
(select id from cms_library_status where cms_library_status_name = 'active'))", 'data':dataDict['cmsLibInsert']}
sqlDict[1] = {'sqlString':"insert into cms_library_metadata (cms_library_id, cms_library_metadata_data) values \
((select id from cms_libraries where cms_library_ident = %(objIdent)s), $$%(objMetadata)s$$)", \
'data':dataDict['cmsLibMetadataInsert']}
sqlDict[2] = {'sqlString':"insert into cms_library_content (cms_library_id, cms_library_content_data) values \
((select id from cms_libraries where cms_library_ident = %(objIdent)s), $$%(objContent)s$$)", \
'data':dataDict['cmsLibContentInsert']}
bulkLoadData(myConfig['pgConn'], myConfig['pgCursor'], sqlDict)
(sqlDict [0])とすべてのものを挿入しない限り、私がそうであるように、それは分離正常に動作します:ここで私が話しているかの例です。私は次の2つを実行する前にコミットします。理想的には、これらのクエリはすべて同じトランザクションで実行したいと思いますが、2番目と3番目のクエリのcms_librariesテーブルからIDを見つけることができないため失敗します。ここ は私の現在の挿入コードです:
def bulkLoadData(dbConn, dbCursor, sqlDict):
try:
libInsertSql = sqlDict.pop(0)
dbSql = libInsertSql['sqlString']
data = libInsertSql['data']
dbCursor.executemany(dbSql, data)
dbConn.commit()
for sqlKey in sqlDict:
dbSql = sqlDict[sqlKey]['sqlString']
data = sqlDict[sqlKey]['data']
dbCursor.executemany(dbSql, data)
dbConn.commit()
は、以前私は、クエリに値を追加して、各挿入のためにクエリを実行していました。私がそれをするとき、私はそれをすべて同じトランザクションに入れることができ、生成されたIDとすべてがうまくいきます。私はexecutemany()で一括挿入を行うとidが見つからないのはなぜ分かりませんか?一括挿入と他の2つのクエリを同じトランザクションで実行する方法はありますか?
私はこの文書を読み、stackoverflowのとインターネットを検索するが、私の問題に答えを見つけることができますされていますすべてのヘルプ、提案、またはコメントいただければ幸いです:さんは pyscopg docs などのpostgres 。 ありがとう、 ミッチ
明らかに私は私の質問で回答が得られていないので、質問の2番目の部分を削除して別にそれを聞いてきました。私は誰かがこのことを理解するのを助けることを願っています... – mcfar
SET [log_statement](http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html)= all'を有効にできますか? PostgreSQLサーバのログを確認してください。実際にどのコマンドを受け取ったのですか? –
私は旅行を外出していたので、私は応答が遅いですが、コメントをいただきありがとうございます、それは良い提案です。私はそれを試し、何が起こっているかを明らかにするかどうかを見ます。 – mcfar