首页 > 解决方案 > 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']”附近:语法错误

`

标签: python

解决方案


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

推荐阅读