一つ目としてSQLite3でcreate tableで型を指定してもどんな型でもそれなりに保持されてしまう。
使用用途がそういう感じなのでこれはこれでいいのかもしれない。
integerで項目を作ってもtextを使用すればそのまま登録されてしまう。
小数点のデータの場合はもっと深刻で小数点以下が2進数で表現できない場合、誤差が表示されて気持ちが悪い。
日付を数字だけの表現にして登録すると勝手にintegerに変換されてpythonだとlong扱いになってしまう。
DB-APIのプレースホルダの扱いに癖があるのかな?
置換するために "?"を使ったが ":name" の形式で渡してあげると変わるかな?
import datetime
import sqlite3
dbname = ':memory:'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
sql = "create table sensors (timestamp varchr(12))"
cur.execute(sql)
insert_sql = "insert into sensors values (?)"
values = (datetime.datetime.now().strftime("%Y%m%d%H%M"),)
cur.execute(insert_sql, values)
insert_sql = "insert into sensors values (:t)"
values = {"t":datetime.datetime.now().strftime("%Y%m%d%H%M"),}
cur.execute(insert_sql, values)
conn.commit()
select_sql = "select timestamp from sensors";
cur.execute(select_sql)
row = cur.fetchone()
while row != None:
print(row)
row = cur.fetchone()
cur.close()
conn.close()
(201709081310L,)
(201709081310L,)
結果は"?" でも ":name"でも変わらず。
python3で実行してみると
(201709081312,)
(201709081312,)
となりました。念のためtype()で確認してみると、<class 'int'>となっていて、python3でもint型に変換されているみたいですね。
0 件のコメント:
コメントを投稿