PythonでMySQLデータベースへの挿入後にIDを取得する方法
はじめに
PythonからMySQLデータベースへレコードを挿入する際、「今挿入したばかりのレコードのID(AUTO_INCREMENTで自動採番された値)をすぐに取得したい」というケースは非常によくあります。本記事では、pymysqlライブラリを使ってMySQLにデータを挿入し、その直後にIDを取得する具体的な手順を解説します。
前提条件
作業を始める前に、以下の環境が整っていることを確認してください。
- MySQL 8.0.12 がインストールされていること
- Python 3.6.3(32ビット) がインストールされていること
- pipコマンドで pymysql がインストールされていること
pymysqlのインストール方法
pymysqlがまだインストールされていない場合は、以下のpipコマンドを実行してください。
pip install pymysql
サンプルデータベースの準備
今回は、データベース名を「business」、テーブル名を「student」とします。すでに複数件のレコードが登録されており、最新のレコードにはIDとして「3」が割り振られている状態です。
テーブルの中身を確認するためのクエリは以下のとおりです。
mysql> select * from student;
実行結果は次のようになります。
+------+-------+ | id | Name | +------+-------+ | 1 | John | | 2 | Bob | | 3 | Smith | +------+-------+ 3 rows in set (0.00 sec)
Pythonで挿入後のIDを取得する
同じデータベース「business」・テーブル「student」に対して、Pythonから新しいレコードを挿入し、その直後にIDを取得してみましょう。ポイントは、カーソルオブジェクトのlastrowid属性を参照することです。これは、直前に実行したINSERT文によって生成されたAUTO_INCREMENTの値を返してくれます。
以下がPythonコードの例です。
import pymysql
# MySQLサーバーへ接続
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='business'
)
cursor = conn.cursor()
# レコードを挿入
sql = "INSERT INTO student (Name) VALUES (%s)"
cursor.execute(sql, ('David',))
# 挿入後に自動採番されたIDを取得
inserted_id = cursor.lastrowid
print("挿入されたレコードのID:", inserted_id)
# 変更を確定して接続を閉じる
conn.commit()
cursor.close()
conn.close()
ポイント: IDの取得には cursor.lastrowid のほかに conn.insert_id() を使う方法もあります。どちらも直近のINSERTで生成されたIDを返します。
実行結果
スクリプトを実行すると、MySQL側とPython側の両方で、挿入直後のレコードに割り当てられたIDを確認できます。たとえば、既存の最大IDが「3」だった場合、新しく挿入されたレコードのIDとして「4」が出力されます。
挿入されたレコードのID: 4
まとめ
pymysqlを使えば、INSERT実行後にlastrowidを参照するだけで、自動採番されたIDを簡単に取得できます。外部キーとして関連テーブルへ登録する場合など、挿入直後にIDが必要となる処理では、ぜひこの方法を活用してください。
-
JavaでMySQLデータベースにデータを挿入する方法をわかりやすく解説
JavaからMySQLデータベースにデータを挿入するには、SQLのINSERTコマンドを使用します。基本的な構文は以下の通りです。 INSERT INTO テーブル名(カラム名1, カラム名2, ......カラム名N) VALUES(値1, 値2, ......値N); ここからは、Javaプログラムを使って実際にMySQLデータベースへレコードを挿入する手順を、順を追って見ていきましょう。 ステップ1:MySQLでテーブルを作成する まず、データの挿入先となるテーブルをMySQL側に作成します。以下のクエリを実行してください。 mysql> create table Insert
-
JDBCを使ってMySQLデータベースにファイルを保存・挿入する方法
一般的に、ファイルの内容はMySQLデータベースでは Clob 型(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)のカラムに保存されます。 JDBCはClob型をサポートしており、これを利用することでファイルの内容をデータベースのテーブルに格納できます。 PreparedStatement インターフェースが提供する setCharacterStream() メソッドは、パラメータのインデックス(位置)を表す整数と、Readerオブジェクトを引数として受け取ります。 このメソッドを使うと、指定したインデックスのプレースホルダ(?)に対して、Readerオブジェクト(ファイ