問題タブ [psycopg]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python-PostgreSQLpsycopg2インターフェース->executemany
私は現在、ウィキペディアのダンプファイルを分析しています。私はPythonを使用してそこから大量のデータを抽出し、それをPostgreSQLデータベースに永続化しています。このファイルは巨大(18GB)なので、私は常に物事をより速くするように努めています。PostgreSQLとのインターフェースのために、私はpsycopg2を使用していますが、このモジュールは他の多くのそのようなDBAPIを模倣しているようです。
とにかく、cursor.executemany(command、values);に関する質問があります。これらの500万個の値のそれぞれに対してcursor.execute(command%value)を呼び出すよりも、1000個の値ごとにexecutemanyを実行する方が良いように思えます(確認または修正してください!)。
しかし、ご覧のとおり、私はexecutemanyを使用して、UNIQUE整合性制約のあるテーブルに1000行を挿入しています。この制約はPythonで事前に検証されていません。これは、常にSELECTを実行する必要があるか(これは逆効果のようです)、3GBを超えるRAMを取得する必要があるためです。これはすべて、スクリプトがpsycopg2.DatabaseErrorをキャッチして既存の行を挿入しようとしたときに、Postgresが警告を発することを期待していることを意味します。
私のスクリプトがそのような非一意のINSERTを検出すると、connection.rollback()(毎回最大1000行になり、実行の多くが無価値になります)、次にすべての値を1つずつINSERTします。
psycopg2の文書化が不十分であるため(多くの優れたモジュールがそうであるように...)、効率的で効果的な回避策を見つけることができません。実行ごとの非一意のINSERTの可能性を減らすために、実行ごとにINSERTされる値の数を1000から100に減らしましたが、これらの値はpsycopg2にこれらの例外を無視するように、またはカーソルを押して実行を続行します。
基本的に、これは非常に簡単で人気のある解決策を持っている種類の問題のように思われるので、私にできることはそれについて学ぶために尋ねることだけです。
再度、感謝します!
python - Psycopg で Pg に挿入するには
Python で SQL ステートメントを修正するにはどうすればよいですか?
データベース接続は機能します。ただし、false であるnonecur.execute
を返します 。
私のコード
Psql の SQL コマンドは正しい出力を返します。INSERT
同様に Psqlでも実行できますが、Python のスクリプトでは実行できません。/var/log に警告/エラーが表示されません。
考えられるバグは
- cursor()、しかし正しいようです
- メソッドconnect()の構文は問題ないようですが、
python - 自動コミットモードの接続で BEGIN が実行されている場合、Postgres は何をしますか?
Postgres (psycopg) 接続を使用する場合の「自動コミット」の概念をよりよく理解しようとしています。新しい接続があり、その分離レベルをISOLATION_LEVEL_AUTOCOMMITに設定し、カーソルの開始/ロールバックメソッドを使用せずにこのSQLを直接実行するとします(演習として;実際にこれをやりたいとは言っていません):
INSERT C と D はどうなりますか?
自動コミットは、BEGIN の発行方法に影響する psycopg の純粋な内部設定ですか? その場合、上記の SQL は影響を受けません。INSERT A と B は完了するとすぐにコミットされますが、C と D はトランザクションで実行され、ロールバックされます。そのトランザクションはどの分離レベルで実行されますか?
それとも、自動コミットは接続自体の実際の設定ですか? その場合、BEGIN の処理にどのような影響がありますか? それは無視されますか、それとも実際にトランザクションを開始するために自動コミット設定をオーバーライドしますか? そのトランザクションはどの分離レベルで実行されますか?
それとも完全に的外れですか?
python - Pythonは文字列に「E」を追加します
この文字列:
常に次のように展開されます:
誰でも理由を教えてもらえますか?
編集: 上記の展開された文字列は、データベースがエラー メッセージで返す文字列です。postgres データベースにアクセスするために psycopg2 を使用しています。実際のコードは次のようになります。
python - osx の下の Psycopg2 はコマンドラインでは動作しますが、Aptana スタジオでは失敗します
私は 6 か月間、Python/Snowleopard で楽しく開発してきました。Python を 2.6.5 にアップグレードし、psycopg2 や Turbogears などの多数のライブラリをアップグレードしました。tg-admin を起動して、いくつかのクエリを問題なく実行できます。同様に、私の Web サイトをコマンド ラインから問題なく実行できます。
ただし、Aptana Studio でアプリケーションを起動しようとすると、psychopg2 をインポートしようとすると、次の例外が発生します。
('dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/psycopg2/_psycopg.so, 2): シンボルが見つかりません: _PQbackendPID\n 参照元: /Library/Frameworks /Python.framework/Versions/2.6/lib/python2.6/site-packages/psycopg2/_psycopg.so\n 期待される: flat 名前空間\n in /Library/Frameworks/Python.framework/Versions/2.6/lib/python2 .6/site-packages/psycopg2/_psycopg.so',)
これは、次のコードを実行した後に発生します: try: import psycopg2 as psycopg except ImportError as ex: print "import failed :-( xxxxxxxx = " print ex.args
import sys print "python version: ", sys.version_info で同じバージョンの python が動作していることを確認しました。
誰にもアイデアはありますか?これが64ビットの問題であることをほのめかしているいくつかの参照があるようです。-デイブ
python - ジャンゴ、postgres 8.4、psycopg 2.2.2、python 2.7、mod_wsgi
django/postgres をローカルの django サーバーにインストールしましたが、正常に動作します。私はApacheを動かそうとしています。mod_wsgi をセットアップして、「Hello World」を取得し、Apache を再起動することができました。私はほとんどそこにいますが、localhost/index.html を起動すると、次のサーバー エラーが発生します。
mod_wsgi とバージョン psycopg に互換性がない可能性はありますか? このタイプのセットアップを試した人はいますか?
更新 1:
2.6、mod_wsgi、psycopg2 にダウングレードしましたが、Apache ログ ファイルにこのエラーが表示されます。
Fri Sep 03 12:17:41 2010] [error] [client 97.80.165.181] File "C:\Python26\lib\site-packages\django\db\__init__.py", line 77, in [Fri Sep 03 12] :17:41 2010] [エラー] [クライアント 97.80.165.181] 接続 = 接続[DEFAULT_DB_ALIAS] [2010 年 9 月 3 日金曜日 12:17:41] [エラー] [クライアント 97.80.165.181] ファイル "C:\Python26\lib\ getitem の site-packages\django\db\ utils.py "、91 行目[2010 年 9 月 3 日金曜日 12:17:41] [エラー] [クライアント 97.80.165.181] backend = load_backend(db['ENGINE']) [2010 年 9 月 3 日金曜日 12:17:41] [エラー] [クライアント 97.80.165.181 ] ファイル "C:\Python26\lib\site-packages\django\db\utils.py"、49 行目、load_backend [Fri Sep 03 12:17:41 2010] [error] [client 97.80.165.181] raise ImproperlyConfigured (error_msg) [Fri Sep 03 12:17:41 2010] [error] [client 97.80.165.181] TemplateSyntaxError: レンダリング中に不適切な構成がキャッチされました: 'django.db.backends.postgresql_psycopg2' は利用可能なデータベース バックエンドではありません。[Fri Sep 03 12:17:41 2010] [error] [client 97.80.165.181] django.db.backends.XXX を使用してみてください。XXX は次のいずれかです: [Fri Sep 03 12:17:41 2010] [error] [クライアント 97.80.165.181]
'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3' [Fri Sep 03 12:17:41 2010] [error] [client 97.80.165.181] Error was: cannot import name utils
それが何を示しているか知っていますか?
更新 2:
原因はファイル django/db/backends/postgresql_psycopg2/base.py、バージョン 2.2.2、行番号 9: from django.db import utils にあります。
しかし、私はまだこれを修正する方法を知りません。django/db/utils.py というファイルがあるので、これで動くはずです。結局のところ、開発サーバーでも機能します。ただし、Apache + mod_wsgi には対応していません
python - Python と psycopg がネットワーク エラーを検出する
psycopg を使用して postgresql データベースに接続し、ネットワーク ケーブルを抜いてもエラーは発生しません。ユーザーに通知するコードでこれを検出するにはどうすればよいですか?
postgresql - postgresql CLUSTERコマンドがデッドタプルをクリアしない
特定のディレクトリに配置されたcsvファイルからすべての行を自動的に取得し、それらをテーブルにインポートするバックグラウンドプロセス(無限ループのLinuxデーモン)があります。デーモンは、ディレクトリに表示されるファイルを 1 つずつ処理し、python で記述され、psycopg2 を使用して postgresql データベースに接続します。
このプロセスでは、INSERT ステートメントを使用してこれらのレコードをインポートしますが、最初に csv ファイル内のレコードと同じ一意のキーを持つすべてのテーブル レコードを削除します。一般に、プロセスは、挿入するすべてのレコードのレコードを削除します。したがって、このデーモンはバックグラウンドで実行されているため、行を削除してから挿入します。1 つのファイルを処理するたびに、明確にトランザクションをコミットし、カーソルを閉じてから、接続を閉じます。
定期的に (1 日に 2 回) CLUSTER を実行して、不要なタプルを削除し、テーブルを管理可能なディスク サイズに保ちます。
ただし、このプロセスの何かが、プロセスの実行中に削除されるすべてのレコードのデッド タプルを CLUSTER コマンドが削除するのを妨げています。プロセスの実行中に CLUSTER を実行すると、このインポートされたデータを含むテーブルのディスク上のサイズが減少せず、pg_stat_user_tables に多くのデッド タプルが表示されるため、これが発生していることがわかります。
プロセスを停止してから CLUSTER を実行すると、テーブルのディスク上のサイズが劇的に減少し、pg_stat_user_tables はデッド タプルがすべてなくなったことを報告します。
奇妙なのは、トランザクションをコミットし、各ファイルを処理するたびに接続を閉じていることです。そのため、プロセスの実行中にデッドタプルを削除できない理由がわかりません。
また、奇妙なことに、プロセスを停止してプロセスを再開し、CLUSTER を実行すると、前回のデーモン プロセスの実行によって作成されたデッド タプルがすべて削除されます。ただし、その後の CLUSTER の呼び出しでは、デーモン プロセスの現在の実行によって作成されたデッド タプルはクリアされません(もちろん、まだ実行中です)。
そのため、トランザクションをコミットし、死んだタプルを作成した postgres へのすべての接続を閉じたとしても、プロセスが停止するまで、何かが死んだタプルへの何らかのリンクを維持しています。pg_locks は開いているロックを報告せず、実行中のトランザクションも報告しないため、ロックまたは開いているトランザクションの問題ではないようです。
結局のところ、これはテーブルで CLUSTER を定期的に実行することを妨げているため、テーブルが成長し続けないようにしています。
これには簡単な答えがあると確信していますが、どこにも見つかりません。プロセスのスケルトン コードを以下に示します。本当に単純なプロセスなので、ここで何が起こっているのかわかりません。ガイダンスをいただければ幸いです。
django - django/postgresql セットアップ - psycopq2.OperationalError
実行時に「psycopq2.OperationalError」が発生します: python manage.py syncdb. djangostack スクリプトでテストしたところ、postgresql サーバーは稼働しているようです。誰でもこれに出くわしますか?django のチュートリアルを読んでセットアップするだけです。フレームワークの完全な初心者... このフォーラムで同様の問題をたくさん見つけましたが、完全に一致するものはないようです... ありがとう!
python - 大規模な挿入を行うと、PostgreSQL 接続が予期せず閉じます
別のデータベースから以前に選択された〜11.000.000行をPostgreSQLテーブルに入力しています。Python と psycopg2 を使用しています。プロセス全体が完了するまでに推定 1.5 時間かかります。ただし、約 30 分後に「接続が予期せず閉じられました」という例外が発生します。ソースコードは次のようになります。
開いているトランザクションに最大 30 分の上限時間があるか、カーソルに保留中の挿入の上限があると仮定して、失敗した最初の試行の後に挿入(1)
しました。(2)
この仮定はどれも正しくなく、エラーは別の場所にあるようです。
両方のデータベースは、ホストからのポート転送を介して接続する VirtualBox マシンに格納されています。ホストマシンでプログラムを実行します。
どちらのデータベースもテスト目的のみであり、管理する他の接続はありません。psycopg2
これを回避するには問題を書き直す必要があるかもしれませんが、他の場所で非常に時間のかかる挿入が必要なので (約数日間実行されます)、または PostgreSQLの隠れた時間制限について非常に心配しています。