我在将值插入SQLite数据库时遇到问题。我从挪威议会网站data.stortinget.no下载的数据。我得到的错误是:sqlite3.OperationalError:无法识别的令牌:“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上面打印的消息是: 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手册,似乎支持这种格式,所以我想知道问题的来源。
答案 0 :(得分:9)
正确的方法是使用参数化查询 例如:
cur.execute("""INSERT INTO perioder(fra, id, til)
VALUES (?,?,?);""", (fra, per_id, til))
每个数据库驱动程序都有一个特定的参数“style”
对于SQLite,参数样式为?
。
另请注意,参数值作为第二个参数传递给execute()
使用字符串插值会使您容易受到各种引用问题的影响(比如引入此处的问题)以及SQL注入攻击的可能性。
有关详细信息,请参阅the DB-API和database programming wiki。
答案 1 :(得分: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")"