#03 INSERT文を実行


INSERTを実行

今度はINSERTしてみましょう。

sql="INSERT INTO Persons (name) VALUES ('テスト太郎')"
with conn.cursor() as cursor:
        cursor.execute(sql)
        conn.commit()

sql='SELECT id,name FROM Persons'
with conn.cursor() as cursor:
        cursor.execute(sql)
        results = cursor.fetchall()

for line in results:
        print(line)
実行結果

$ ./mysql_test.py 
(2, '赤城啓太')
(3, 'テスト太郎')
INSERTはexcuteした後にcommitする必要があります。もしcommitしないとDBに反映されません。

COMMITとデータ描き込みのタイミング

次のようなコードを実行してみましょう。

sql="INSERT INTO Persons (name) VALUES ('新テスト太郎')"
with conn.cursor() as cursor:
        cursor.execute(sql)

        sql='SELECT id,name FROM Persons'
        with conn.cursor() as cursor:
                cursor.execute(sql)
                results = cursor.fetchall()

for line in results:
        print(line)
これを実行すると下記の結果になります。

$ ./mysql_test.py 
(2, '赤城啓太')
(3, 'テスト太郎')
(4, '新テスト太郎')
しかし、実際にデータベースを見に行くと新テスト太郎は追加されていません。

MariaDB [python_test]> SELECT id,name FROM Persons;
+----+-----------------+
| id | name            |
+----+-----------------+
|  2 | 赤城啓太        |
|  3 | テスト太郎      |
+----+-----------------+
2 rows in set (0.00 sec)
これはDBのトランザクションの機能を使っています。トランザクションを開始した後もデータは最新のように見せて実データの書き換えはCOMMITをするまで行われませんが、SELECTなどの読取り系の操作をしたとしても、最新(の予定)のデータが返ってきます。

auto_incrementは戻らない

なお、INSERTした後COMMITせずにプログラムを終了した場合、auto_incrementの数字は更新され、戻りません。その為コケたトランザクションがいると、下記のようにauto_incrementが飛び飛びの数字になります。

MariaDB [python_test]> SELECT id,name FROM Persons;
+----+-----------------+
| id | name            |
+----+-----------------+
|  2 | 赤城啓太        |
|  3 | テスト太郎      |
|  4 | テスト太郎      |
|  5 | テスト太郎      |
|  6 | テスト太郎      |
|  7 | テスト太郎      |
| 21 | テスト太郎      |
+----+-----------------+
7 rows in set (0.00 sec)