Python sqlite3 - 在“2017”附近的operationalerror
问题描述:
我是编程新手。我有dictionary
称为记录,它接收各种输入,如'颜色','类型''数量'等。现在我试着添加一个日期列,然后插入到sqlite表中,通过下面的代码运行'if循环'。但是我收到了“2017年附近的操作错误”,即接近日期。Python sqlite3 - 在“2017”附近的operationalerror
任何人都可以帮忙吗?在此先感谢
Date = str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d'))
record['Date'] = Date
column = [record['Color'], Date]
values = [record['quantity'], record['Date']]
column = ','.join(column)
if record['Type'] == 'T-Shirts' and record['Style'] == 'Soft':
stment = ("INSERT INTO xtrasmall (%s) values(?)" %column)
c.execute(stment, values)
conn.commit()
答
更新
您可以简化代码如下:
from datetime import datetime
date = datetime.now().date()
sql = "INSERT INTO xtrasmall (%s, Date) values (?, ?)" % record['Color']
c.execute(sql, (record['quantity'], date))
这个替换所选颜色的值直接进入查询字符串的列名。然后执行查询将数量和日期字符串作为参数传递。日期应自动转换为字符串,但如果需要,可以使用str()
进行转换。
这确实假设其他颜色列有一个默认值(大概为0),或允许空值。
原来的答复
因为你是用绳子插构建查询(即一个字符串替换%s
)您的发言变得像这样:
INSERT INTO xtrasmall (Red,2017-10-06) values(?)
这是无效的因为2017-10-06
不是有效的列名称。在执行它之前打印出stment
以查看。
如果你知道什么列名只是指定它们在查询:
values = ['Red', 2, Date]
c.execute("INSERT INTO xtrasmall (color, quantity, date) values (?, ?, ?)", values)
conn.commit()
您需要使用?
为要插入每一列。
它看起来像你想插入字典使用其键和值。这是可以做到这样的:
record = {'date':'2017-10-06', 'color': 'Red', 'quantity': 2}
columns = ','.join(record.keys())
placeholders = ','.join('?' * len(record.values()))
sql = 'INSERT INTO xtrasmall ({}) VALUES ({})'.format(columns, placeholders)
c.execute(sql, record.values())
该代码将生成参数化的SQL语句:
INSERT INTO xtrasmall (date,color,quantity) VALUES (?,?,?)
,然后用字典的值作为参数来执行。
请参阅http://www.sqlite.org/datatype3.html#datetime。 –