python - sqlite python 3插入OperationalError语法
问题描述
所以我有一个函数可以读取一个txt,解析它,然后将它加载到一个sql表中。
def main():
connection = sqlite3.connect("myTable.db")
crsr = connection.cursor()
lines = open("LLA03132A.txt", "r").readlines()
input = Thpt(lines)
sql = """CREATE table if not exists my_table (
date STRING,
site STRING,
sector STRING,
avg_thpt FLOAT
);"""
crsr.execute(sql)
for x in input:
time = x[0]
site = x[1][1:8]
sector = x[1]
avg_thpt = x[2]
sql = """INSERT INTO my_table VALUES ( %s , %s , %s , %f );"""%(time, site, sector, avg_thpt)
print(sql)
crsr.execute(sql)
connection.commit()
connection.close()
但是,当我调用它时,我得到了这个错误。我究竟做错了什么?我是否错误地命名了我的类别或我的价值观?某处有隐藏角色吗?我也在使用 datetime 包,仅供参考
Traceback (most recent call last):
INSERT INTO my_table VALUES ( 2018-07-03 10:14:18.060416 , LA03132 , LLA03132A11 , 2637.806265 );
File "C:/Users/myname/PycharmProjects/Parser/parser2.py", line 60, in <module>
main()
File "C:/Users/myname/PycharmProjects/Parser/parser2.py", line 55, in main
crsr.execute(sql)
sqlite3.OperationalError: near "10": syntax error
解决方案
当您应该使用参数传递时,您正在使用缓慢且不安全的字符串插值。
也是sqlite3.paramstyle
,'qmark'
因此您应该将?
其用作参数的占位符:
params = (x[0], x[1][1:8], x[1], x[2])
sql = """INSERT INTO my_table VALUES (?, ?, ?, ?);"""
print(sql)
crsr.execute(sql, params)
请注意,sql 和参数是分别传递给驱动程序的,因此数据库的工作是进行参数插值。这使您从引用地狱中解放出来,并通过不允许 sql 注入攻击使您的代码更安全。它也更快。
推荐阅读
- java - 为什么我在使用方法更改变量值时无法更改 onCreate 中的变量值?
- c# - 为什么 sizeof 在零字段结构中返回 1
- xml - Google 表格中的 IMPORTXML 语法问题
- python - ModuleNotFoundError:没有名为“的模块”
' - c# - 如何让程序每次从列表中选择不同的字符串,而不是一遍又一遍地编写相同的字符串?
- c++ - C++ / Qt:如何检测主机名或 IP 地址何时引用当前系统?
- javascript - VueJs 中的动态类和颜色绑定?
- ibm-mq - 如何修复未解析的交换问题 IBM MQ 消息到 BizTalk
- r - 将带有图像的 .Docx 转换为 Rmarkdown 效果不佳
- ruby-on-rails - 在 hash 的 map 块中调用函数