2

データベースのサービス層を作成しているため、特定の操作を実行する関数を作成しています。Atm それらのいくつかは単純な非同期挿入です。ただし、膨大な量のパラメーターがあります。

私はスクレイピーからスパイダー データを使用しており、Python dict のような API を持つスクレイピーのitemコンセプトを使用しています。ストアド プロシージャ シグネチャ/ストアド プロシージャ呼び出しの構築、または挿入ステートメントのすべてのフィールドをパラメーター化する必要はありません。

まず、複合型が 2 回宣言されていることに注意してください。1つ目はcreate tablepostgres のステートメントで、2 つ目はアイテム インターフェイスを使用したスクレイピーです。そう :

pyscopg2 を使用して Python dict のようなエンティティを postgres に入れる最もクリーンな方法は何ですか?

tablename%ROWTYPEストアド プロシージャの入力パラメーターとして宣言する必要があると考えていますが、実行クエリ文字列を作成するときに、python dict のようなオブジェクトをどのようにマップしますか? psycopg2の複合型ケーシングと関係があると思います。しかし、ドキュメントから全体像を見ることはできません。

議論のために、対応するスクレイピータイプを持つユーザーテーブルを考えてみましょうCREATE TABLE( name character varying, id integer primary key).プライマリIDはドメイン内で暗黙的に一意です. デフォルト値と pkey シリアライザーが配置されている場合に挿入がどのように見えるかについてのコメントも役立ちます:D

Sql Adaption Protocolを使用して、汎用ルーチンでスクレイピー アイテムをサブクラス化し、スクレイピー アイテムを postgres 複合型に変換できますか? これは賢明でしょうか?

4

1 に答える 1

0

Postgres wiki には次のように書かれています。

最後に紹介したい項目は、辞書を使用して複数の行を挿入する方法です。次の場合:

namedict = ({"first_name":"Joshua", "last_name":"Drake"},
            {"first_name":"Steven", "last_name":"Foo"},
            {"first_name":"David", "last_name":"Bar"})

次を使用して、辞書内に 3 つの行すべてを簡単に挿入できます。

cur = conn.cursor()
cur.executemany("""INSERT INTO bar(first_name,last_name) VALUES (%(first_name)s, %(last_name)s)""", namedict)

hstore モジュールには、構造化された行タイプを作成する関数があります。

CREATE TABLE test (col1 integer, col2 text, col3 text);

SELECT * FROM populate_record(null::test,
                              '"col1"=>"456", "col2"=>"zzz"');
 col1 | col2 | col3 
------+------+------
  456 | zzz  | 
(1 row) 
于 2012-07-14T15:29:43.123 に答える