後psycopg2自動コミットを設定することができませんが、このようなPythonのサブプロセスに包まれ、psqlを介して、パイプ:私はshp2pgsqlとを使用してPostGISのデータベースにシェープファイルをロードしていますshp2pgsqlとインポート
command = "shp2pgsql -s 4269 -a -D -W LATIN1 file.shp table | psql -h host -d db -U user"
p=subprocess.Popen(command, shell=True)
p.communicate()
これは、次の出力で、完璧に動作します:
Loading objects...
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
SET
SET
BEGIN
COMMIT
にはEND
文はありませんが、私の知る限りにEND
とCOMMIT
は同等です。
同じデータベースへのpsycopg2接続の場合は、con.autocommit = True
と設定します。
psycopg2.ProgrammingError: autocommit cannot be used inside a transaction
なぜpsycopg2はトランザクションがまだ進行中であると報告しますか? psqlトランザクションを閉じるべき別の方法はありますか?
shp2pgsqlサブプロセスコマンドを実行しないと、con.autocommit
が正常に実行されます。デフォルトではshp2pgsqlはトランザクションをどこかで開いたままにしますか? (http://www.bostongis.com/pgsql2shp_shp2pgsql_quickguide.bqgはこれを示唆していません)
ストール/アイドルトランザクションを示唆する関連エントリはpg_locks
に存在しません。私はshp2pgsql関数でpsycopg2接続オブジェクトを使用しません。正常に動作con.autocommit=True
shp2pgsqlと機能、後、私は新しい接続オブジェクトを再作成する場合
con = psycopg2.connect(host=db_host, user=db_user, password=db_pass, database=db_name)
。
編集:すべてのshp2pgsqlのインポートが完了した後ももちろんpsycopg2接続オブジェクトを作成できますが、これは自分のコードでは理想的ではありません。
Edit2:psycopg2接続を開いた直後に、を設定すると、後ではなくこのエラーが回避されます。
EDIT3:追加MWE
import psycopg2
import os
import subprocess
from glob import glob
def vacuum(con, table=""):
autocommit_orig = con.autocommit
con.autocommit = True
with con.cursor() as cur:
cur.execute("VACUUM ANALYZE {};".format(table))
con.autocommit = autocommit_orig
def read_shapefile(path, tablename, srid="4269"):
command = "shp2pgsql -s {} -a -D -W LATIN1 {} {} | psql -h {} -d {} -U {}".format(srid, path, tablename, host, dbname, user)
p=subprocess.Popen(command, shell=True)
p.communicate()
def load_data(con, datapath):
dir = os.path.join(datapath,dataname)
shapefiles = glob(os.path.join(dir,"*.shp"))
for shapefile in shapefiles:
read_shapefile(shapefile, tablename)
if __name__ == "__main__":
con = psycopg2.connect(host=db_host, user=db_user, password=db_pass, database=db_name)
load_data(con, datapath)
vacuum(con, tablename)
MWEを投稿できますか?私はコードがどのように配置されているかを理解したいと思います。 – Richard
元の投稿に上記のMWEを追加しました。 –