Pythonを使用してMySQLデータベースに挿入した後、「id」を取得するにはどうすればよいですか?


183

INSERT INTOステートメントを実行します

cursor.execute("INSERT INTO mytable(height) VALUES(%s)",(height))

主キーを取得したいと思います。

私のテーブルには2つの列があります。

id      primary, auto increment
height  this is the other column.

これを挿入した後、「ID」を取得するにはどうすればよいですか?


回答:


243

使用cursor.lastrowidカーソルオブジェクトに挿入された最後の行のIDを取得するために、またはconnection.insert_id()その接続上の最後のインサートからIDを取得します。


3
2つのプロセスが同じ接続を使用して同時に行を挿入するとどうなるでしょうか。どのIDがinsert_id返されますか?
xiaohan2012 2014年

27
@ xiaohan2012 2つのプロセスが同じ接続をどのように使用するのですか?
hienbt88 2014

5
あるlastrowid現在のトランザクションがコミットされた後にのみ利用可能?
John Wang

4
@ hienbt88彼はおそらくスレッドを意味していましたが、私はそれを行ったので、スレッドセーフを適切に利用しないと問題が発生する可能性があります。私は個人的に各スレッドの新しい接続をインスタンス化しましたが、なんらかの理由でコミット(実際には自動コミット)が機能しなかったのでかわいい回避策です毎秒。
ミラノヴェレビット2018

挿入、選択、場所を使用した重複レコードでは機能しません。
e-info128 2018年

114

また、cursor.lastrowid(MySQLdbでサポートされているdbapi / PEP249拡張機能):

>>> import MySQLdb
>>> connection = MySQLdb.connect(user='root')
>>> cursor = connection.cursor()
>>> cursor.execute('INSERT INTO sometable VALUES (...)')
1L
>>> connection.insert_id()
3L
>>> cursor.lastrowid
3L
>>> cursor.execute('SELECT last_insert_id()')
1L
>>> cursor.fetchone()
(3L,)
>>> cursor.execute('select @@identity')
1L
>>> cursor.fetchone()
(3L,)

cursor.lastrowidconnection.insert_id()MySQLへの別の往復よりもやや安く、はるかに安いです。


4
なぜcursor.lastrowidより安いのですconnection.insert_id()か?
Martin Thoma 14年

3
これは、cursor.lastrowidがcursor.execute()の一部としてカーソルオブジェクトに自動的に設定され、単なる属性ルックアップであるためです。connection.insert_id()は追加の不要な関数呼び出しです。これはすでに呼び出されており、その結果はlastrowid属性で利用できます。
Andrew

5
とはcursor.lastrowid異なる何かが返されるという問題が発生しましたconnection.insert_id()cursor.lastrowid最後の挿入IDをconnection.insert_id()返しました0。それはどうしてですか?
Martin Thoma 14

1
@moose、たぶん、並行プロセスが同じ接続を使用してデータベースの並列挿入を行っています。
xiaohan2012 2014年

1
@FlyingAtom、これはpython3ではなくpython2で実行されたため。
Andrew

35

Python DBAPI仕様では、カーソルオブジェクトの「lastrowid」属性も定義しているため、...

id = cursor.lastrowid

...動作するはずであり、接続ごとに明らかに基づいています。


7
SELECT @@IDENTITY AS 'Identity';

または

SELECT last_insert_id();

2
サーバーから最後の行IDを要求しているため、これにより競合状態が可能になります。私は、あなたがその混乱を望まないからです。
ジョシュアバーンズ


1
この部分も同様に重要であることを指摘しておきます。「各クライアントは、クライアントが実行した最後のステートメントに対して最後に挿入されたIDを受け取ります。」まったく同じ実行しているよりも、あなたは、ワークベンチとは異なる値を取得しますので、select last_insert_id()Linuxマシン上でCLIからの
simplycoding

0

これはPythonでのPyMySqlの単なる要件である可能性がありますが、IDが必要な正確なテーブルに名前を付ける必要があることがわかりました。

に:

cnx = pymysql.connect(host='host',
                            database='db',
                            user='user',
                            password='pass')
cursor = cnx.cursor()
update_batch = """insert into batch set type = "%s" , records = %i, started = NOW(); """
second_query = (update_batch % ( "Batch 1", 22  ))
cursor.execute(second_query)
cnx.commit()
batch_id = cursor.execute('select last_insert_id() from batch')
cursor.close()

batch_id

Out:5
...または実際の正しいBatch_ID値


@krzys_hこのKを見ていただきありがとうございますが、あなたの編集は私のテストに失敗したため、あなたの編集を拒否しました。編集を取り消すのもよろしいですか?
エドワード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.