python - OperationalError:“['Date']”附近:语法错误
问题描述
基本上我正在读取一个 .csv 文件并将值插入到数据库中。
import sqlite3
conn = sqlite3.connect('att.db')
cur = conn.cursor()
cur.execute('''create table cardswipe1 ('date','time','cardid')''')
cs = pd.read_csv('tst.csv', error_bad_lines=False)
x = cs.iloc[:,2:-2]
for rows in x:
cur.execute("insert into cardswipe1 values (x['Date'], x['Time'], x['CardID'])")
Data:
Date Time CardID
0 18-12-2017 11:56:59 '00064
1 18-12-2017 14:30:01 '00344
2 18-12-2017 14:30:02 '00031
我无法弄清楚为什么会出现以下错误,感谢指正
OperationalError:“['Date']”附近:语法错误
`
解决方案
import sqlite3
import csv
conn = sqlite3.connect('att.db')
cur = conn.cursor()
cur.execute('''create table cardswipe1 ('date','time','cardid')''')
with open('sample.txt') as f:
rdr = csv.DictReader(f)
for row in rdr:
cur.execute("insert into cardswipe1 (date, time, cardid) values (?, ?, ?)",
(row['Date'], row['Time'], row['CardID']))
conn.commit() # you need to commit changes
或者:
import sqlite3
import csv
conn = sqlite3.connect('att2.db')
with open('sample.txt') as f:
rdr = csv.DictReader(f)
data = [(row['Date'], row['Time'], row['CardID']) for row in rdr]
with conn: # using with context manager commit() is executed automaticaly
conn.execute('''create table cardswipe1 ('date','time','cardid')''')
conn.executemany("insert into cardswipe1 (date, time, cardid) values (?, ?, ?)", data)
因为您使用某种“可信”数据,所以简单的 f 字符串或字符串格式也可以工作,但最好坚持使用参数化查询的最佳实践。如文档中所述:
通常,您的 SQL 操作将需要使用 Python 变量中的值。你不应该使用 Python 的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到 SQL 注入攻击(有关可能出错的幽默示例,请参见https://xkcd.com/327/ )。
相反,使用 DB-API 的参数替换。放 ?作为一个占位符,无论你想在哪里使用一个值,然后提供一个值的元组作为游标的 execute() 方法的第二个参数。
另外,我改为使用 csv,而不是 pandas。你没用pandas.to_sql
。另外,请注意我在第一个片段中添加并在第二个conn.commit()
片段中使用with
了上下文管理器。
如果您决定坚持pandas
- 而不是迭代行,请使用DataFrame.to_sql
import sqlite3
import pandas as pd
conn = sqlite3.connect('att3.db')
conn.execute('''create table cardswipe1 ('date','time','cardid')''')
df = pd.read_csv('sample.txt', dtype={'CardID':str})
df.to_sql('cardswipe1', con=conn, if_exists='append', index=False)
如果您对文件中的标题没问题,则无需在 sqlite3 中创建表,DataFrame.to_sql 将创建具有列名的表,如 df.
这是sqmple.txt
我用过的:
Date,Time,CardID
18-12-2017,11:56:59,00064
18-12-2017,14:30:01,00344
18-12-2017,14:30:02,00031
推荐阅读
- mysql - mysql中的组concat函数不给出结果
- r - 如何使用 expss 创建两个标题表
- django-rest-framework - 如何在 django rest 框架中过滤嵌套的序列化器
- system-verilog - 为什么三元条件赋值的流连接是非法的?
- openmdao - OpenMDAO 为不会导致运行时错误的 ExternalCodeComp 添加命令行参数
- nuget - 使用引用的项目创建和安装 nuget 包
- office-js - Excel 加载项任务窗格 XML 清单中的 AppDomains 元素问题
- javascript - 路由器:基于具有相同路由路径的访问显示组件
- javascript - 计算学生的平均成绩和成绩
- security - 浏览器扩展安全性:带有 UI 元素的内容脚本