タイムゾーン対応の日時オブジェクトを MySQL の DateTime 列に挿入すると、Mysql-Python から警告が表示されます。
test_mysql.py:13: Warning: Out of range value for column 'created_at' at row 1
cur.execute("INSERT INTO test (created_at) VALUES (%s)", now)
テストのコードは次のようになります。
import MySQLdb
from datetime import datetime
from pytz import utc
conn = MySQLdb.connect(...) # connect
cur = conn.cursor()
now = datetime.utcnow()
cur.execute("CREATE TABLE test (created_at DATETIME)")
print("Test 1")
cur.execute("INSERT INTO test (created_at) VALUES (%s)", now)
now = utc.localize(now)
print("Test 2")
cur.execute("INSERT INTO test (created_at) VALUES (%s)", now)
print("Test 3")
now = now.replace(tzinfo=None)
assert now.tzinfo is None
cur.execute("INSERT INTO test (created_at) VALUES (%s)", now)
print("Tests done")
cur.execute("DROP TABLE test")
完全な出力は次のとおりです。
Test 1
Test 2
test_mysql.py:13: Warning: Out of range value for column 'created_at' at row 1
cur.execute("INSERT INTO test (created_at) VALUES (%s)", now)
Test 3
Tests done
元のアプリケーションで SQLAlchemy を使用していますが、これは SQLAlchemy の下の問題であるため、SA を使用する場合と使用しない場合の両方のソリューションに興味があります。