6

我在将值插入 SQLite 数据库时遇到问题。我从挪威议会网站 data.stortinget.no 下载的数据。我得到的错误是: sqlite3.OperationalError: unrecognized token: "01T00"

这是发生错误的方法:(我知道此摘录中的缩进错误)

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 手册,似乎支持该格式,所以我想知道问题出在哪里。

4

2 回答 2

18

正确的方法是使用参数化查询。
例子:

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

每个数据库驱动程序都有一个特定的参数“样式”。
在 SQLite 的情况下,参数样式是?.

另请注意,参数值作为第二个参数传递给execute().
使用字符串插值会使您容易受到各种引用问题(例如将您带到这里的问题)和 SQL 注入攻击的可能性。

有关更多信息,请阅读DB-API数据库编程 wiki

于 2012-06-22T16:55:49.703 回答
0

如果您想TEXT在 SQLite 中将日期标记存储为字符串 ( ),我建议您将要执行的文本格式化如下:

cur.execute("""INSERT INTO perioder(fra, id, til) 
           VALUES (\"%s\",\"%s\",\"%s\")""" % (fra, per_id, til))

如果您插入的值没有逗号,SQLite 会返回错误。\"%s\"使用而不是格式化文本%s将在格式化字符串中插入带引号的字符串值:

"INSERT INTO perioder(fra, id, til) 
           VALUES ("2009-2013", "2009-10-01T00:00:00","2013-09-30T23:59:59")"
于 2020-11-08T18:51:22.253 回答