2017年9月8日金曜日

python + sqlite3で文字列から数値に勝手に変換される?

ロギングさせるために変なところで躓いているところが。

一つ目として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 件のコメント:

コメントを投稿