今度は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に反映されません。
次のようなコードを実行してみましょう。
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などの読取り系の操作をしたとしても、最新(の予定)のデータが返ってきます。
なお、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)