Python
MySQL
どう書く
初心者

PythonからMySQLにNULLをINSERTしたい

More than 1 year has passed since last update.

PythonからMySQL(MySQLdb)を使う時にNULLの挿入やり方が分からなかったのでメモ

環境

以下のようにidと時間を記録するためのテーブルがあるとする。
idにはvarchar(100)timeにはtimestampを用いる。

mysql> show columns from test;
+-------+--------------+------+-----+---------------------+-----------------------------+
| Field | Type         | Null | Key | Default             | Extra                       |
+-------+--------------+------+-----+---------------------+-----------------------------+
| id    | varchar(100) | NO   |     | NULL                |                             |
| time  | timestamp    | NO   |     | 0000-00-00 00:00:00 | on update CURRENT_TIMESTAMP |
+-------+--------------+------+-----+---------------------+-----------------------------+

mysql> select * from test;
+------------------+---------------------+
| id               | time                |
+------------------+---------------------+
| user1            | 2017-10-03 03:42:08 |
| user2            | 2017-10-05 01:36:55 |
| user4            | 2017-10-05 01:41:38 |
+------------------+---------------------+

問題

こちらの記事に詳しく書いてありますが、timestampのデフォルト値をNULLに設定すると、SQL文でNULLが挿入されてた時に、時間が挿入されるというもの。

そのためにPython上から文字列としてのNULLではなくSQL文としてのNULLを挿入したい。

解決策

このような書き方で解決できた。

#coding:utf-8
import MySQLdb

connect = MySQLdb.connect(user='hoge',passwd='hogehoge',host='0.0.0.0',db='test')
c = connect.cursor()

id = "user5"

sql = "insert into test values (%s, %s)'
c.execute(sql,(id,None))
print("ok")

connect.commit()
c.close()
connect.close()

c.execute(sql,(id,None))の部分でNoneを使うとSQL上でのNULL扱いになるらしい。
最初''などで空文字にしてましたが、空文字とNULLは別物とのこと。(参考記事)

今考えてみればかなり当たり前なのですが、Python初心者すぎて解決までに数時間かかりました。