1

PyGreSQLを使用して DB にアクセスしています。私が現在取り組んでいるユースケースでは; テーブルにレコードを挿入し、最後の行 ID を返そうとしています...別名、DB が ID フィールド用に作成した値:

create table job_runners (
    id           SERIAL PRIMARY KEY,
    hostname     varchar(100) not null,
    is_available boolean default FALSE
    );

sql = "insert into job_runners (hostname) values ('localhost')"

最も理にかなった db.insert() を使用すると、「AttributeError」を受け取りました。db.query(sql) を試したところ、OID しか取得できませんでした。

Q: PyGreSQL を使用して、レコードを挿入し、追加の読み取りやクエリを実行せずに ID フィールドの値を返す最良の方法は何ですか?

4

3 に答える 3

2
INSERT INTO job_runners
    (hostname,is_available) VALUES ('localhost',true)
    RETURNING id

とはいえ、pygresqlについてはわかりませんが、すでに書いているdb.query()ことから、ここで使用したいと思います。

于 2009-09-17T12:09:20.167 に答える
1

PyGreSQL のドキュメントには、dbconn.query() を呼び出して挿入/更新ステートメントを実行すると、OID が返されると記載されています。複数の行が含まれる場合の OID のリストについても説明します。

初めに; OID 機能が動作しないことがわかりました。ライブラリとツールのバージョン番号を知っていれば役に立ったと思いますが、OID を返すつもりはありませんでした。

ついに; @hackerが示唆するように、「戻りID」を追加することにより、pygresqlは単に正しいことを行い、結果の辞書にIDを持つレコードセットを返しました(以下のコードを参照)。

sql = "insert into job_runners (hostname) values ('localhost') returning id"
rv = dbconn.query(sql)
id = rv.dictresult()[0]['id']
于 2009-09-17T16:52:05.770 に答える
0

カーソルオブジェクトがあると仮定しますcur:

cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id",
            {'hostname': 'localhost'})
id = cur.fetchone()[0]

これにより、PyGreSQL が入力文字列を正しくエスケープし、SQL インジェクションを防ぐことができます。

于 2010-02-27T00:40:03.923 に答える