1. ホーム
  2. python

[解決済み] Python/postgres/psycopg2: 挿入されたばかりの行のIDを取得する

2022-05-26 13:32:03

質問

Pythonとpsycopg2を使ってpostgresとのインタフェースをとっています。

行を挿入すると...

sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)

... 挿入した行のIDを取得するにはどうすればよいのでしょうか?試してみてください。

hundred = cursor.fetchall() 

はエラーを返しますが RETURNING id :

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ") RETURNING id;"
hundred = cursor.execute(sql_string)

は単に None .

UPDATE: だから currval (を使用することもできます(このコマンドを直接postgresに使用しても動作します)。

sql_string = "SELECT currval(pg_get_serial_sequence('hundred', 'id'));"
hundred_id = cursor.execute(sql_string)

どなたかアドバイスをお願いします。

ありがとうございます。

どのように解決するのですか?

cursor.execute("INSERT INTO .... RETURNING id")
id_of_new_row = cursor.fetchone()[0]

そして、値を含む SQL 文字列を手動で構築しないでください。値を別々に渡すことができ (そしてそうすべきです!) 、エスケープする必要がなくなり、SQL インジェクションを不可能にします。

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES (%s,%s,%s) RETURNING id;"
cursor.execute(sql_string, (hundred_name, hundred_slug, status))
hundred = cursor.fetchone()[0]

詳しくはpsycopgのドキュメントをご覧ください。 http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries