sqlite3.2错误:无法识别的令牌:“0”;01T00“;Python邮戳
我在将值插入SQLite数据库时遇到问题。我从挪威议会网站data.stortinget.no下载的数据。我得到的错误是:sqlite3.OperationalError:无法识别的令牌:“01T00” 下面是出现错误的方法:(我知道这篇摘录中的缩进错误) 在cur.execute正上方打印的消息为: id:2009-2013 fra:2009-10-01T00:00:00截止日期:2013-09-30T23:59:59 整个错误跟踪是:sqlite3.2错误:无法识别的令牌:“0”;01T00“;Python邮戳,python,sqlite,Python,Sqlite,我在将值插入SQLite数据库时遇到问题。我从挪威议会网站data.stortinget.no下载的数据。我得到的错误是:sqlite3.OperationalError:无法识别的令牌:“01T00” 下面是出现错误的方法:(我知道这篇摘录中的缩进错误) 在cur.execute正上方打印的消息为: id:2009-2013 fra:2009-10-01T00:00:00截止日期:2013-09-30T23:59:59 整个错误跟踪是: BigMac:Stortingsdata ola$ py
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"
BigMac:Stortingsdata ola$python getBasicData.py
id:2009-2013 fra:2009-10-01T00:00:00截止日期:2013-09-30T23:59:59
回溯(最近一次呼叫最后一次):
文件“getBasicData.py”,第169行,在
获取周期器(cur)
get\u perioder中第26行的文件“getBasicData.py”
当前执行(“插入周期器(fra,id,til)值(%s,%s,%s)”%(fra,per_id,til))
sqlite3.0错误:无法识别的令牌:“01T00”
我参考了SQLite手册,它似乎支持这种格式,所以我想知道问题出在哪里。正确的方法是使用参数化查询。
例如: 每个数据库驱动程序都有一个特定的参数“style”。
对于SQLite,参数样式为
?
还要注意,参数值作为第二个参数传递给execute()
使用字符串插值会使您容易受到各种引用问题的攻击(如将您带到这里的问题)以及SQL注入攻击的可能性
有关更多信息,请阅读和。如果要在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")"
您没有用引号将日期插入周期器(fra、id、til)值(“%s”、“s”、“s”)
?您插入的是值(2009-2013、2009-10-01T00:00:00、2013-09-30T23:59:59)
。你知道为什么这是错误的,对吗?您刚刚插入了等价的值(-4,-1-01T00:00:00,2004-30T23:59:59)
,这显然是一个语法错误,因为01T00
不能从-1
中减去。只要正确地使用execute
,而不是执行字符串插值。我现在明白了。我以为%s添加了所需的引号,但我错了。谢谢你们两位的帮助,现在开始工作了。当我运行代码时,出现了另一个问题。它执行第一个方法,但不添加来自其他方法的数据。我可以将游标传递给方法并添加数据,还是需要更多游标?(程序没有任何并发性)如果我插入的表有许多字段(远远超过3个),有没有更好的方法来实现这一点?当然。您不必像那样指定列名。此语法也有效:插入到您的_表值(……)代码>。您可以动态生成参数占位符。有关第二步的信息,请参见此答案。
cur.execute("""INSERT INTO perioder(fra, id, til)
VALUES (\"%s\",\"%s\",\"%s\")""" % (fra, per_id, til))
"INSERT INTO perioder(fra, id, til)
VALUES ("2009-2013", "2009-10-01T00:00:00","2013-09-30T23:59:59")"