1. ホーム
  2. python

[解決済み] sqlite3.OperationalError: 認識できないトークン:"01T00" Python datestamp

2022-02-07 17:08:35

質問

SQLiteデータベースに値を挿入する際に問題が発生しています。データはノルウェー国会のサイトdata.stortinget.noからダウンロードしたものです。エラーは次のとおりです: sqlite3.OperationalError: unrecognized token: "01T00".SQLite3.OperationalError:認識できないトークンです。

以下は、エラーが発生したメソッドです。(この抜粋のインデント・エラーは知っています)

def get_perioder(cur):
DOK = "stortingsperioder"
try:
     page = urllib2.urlopen(SITE+DOK)
except:
    print "Failed to fetch item "+DOK
if page:
    tree = ElementTree.parse(page)
    root = tree.getroot()
    top = list(root)[2]
    elements = list(top)
    for el in elements:
        fra = el.find('{http://data.stortinget.no}fra').text
        per_id = el.find('{http://data.stortinget.no}id').text
        til = el.find('{http://data.stortinget.no}til').text
        print "id: %s fra: %s til: %s" % (per_id, fra, til)
        cur.execute("INSERT INTO perioder(fra, id, til) VALUES(%s,%s,%s)" % (fra, per_id, til))
else:
    print "Could not load page: "+DOK

cur.executeのすぐ上のprintで出力されるメッセージは、以下の通りです。 id: 2009-2013 fra: 2009-10-01T00:00:00 til: 2013-09-30T23:59:59 エラートレース全体は

BigMac:Stortingsdata ola$ python getBasicData.py 
id: 2009-2013 fra: 2009-10-01T00:00:00 til: 2013-09-30T23:59:59
Traceback (most recent call last):
  File "getBasicData.py", line 169, in <module>
    get_perioder(cur)
   File "getBasicData.py", line 26, in get_perioder
     cur.execute("INSERT INTO perioder(fra, id, til) VALUES(%s,%s,%s)" % (fra, per_id, til))
 sqlite3.OperationalError: unrecognized token: "01T00"

SQLiteのマニュアルを参照したところ、この形式はサポートされているようなので、問題はどこから来るのでしょうか。

解決方法は?

正しい方法は、パラメトリッククエリを使用することです。

cur.execute("""INSERT INTO perioder(fra, id, til) 
               VALUES (?,?,?);""", (fra, per_id, til))

各データベースドライバには、特定のパラメータ "style" が存在します。
SQLite の場合、このパラメータは次のようなスタイルです。 ? .

また、パラメータの値は、第2引数として execute() .
文字列補間を使用すると、あらゆる種類のクオートの問題(ここに来たような問題)やSQLインジェクション攻撃の可能性があります。

詳しくは、以下をご覧ください。 DB-APIについて データベース・プログラミング・ウィキ .