Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite3.2错误:无法识别的令牌:“0”;01T00“;Python邮戳_Python_Sqlite - Fatal编程技术网

sqlite3.2错误:无法识别的令牌:“0”;01T00“;Python邮戳

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

我在将值插入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$ 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")"