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() 
+0

请参阅http://www.sqlite.org/datatype3.html#datetime。 –

更新

您可以简化代码如下:

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 (?,?,?) 

,然后用字典的值作为参数来执行。

+0

感谢您的回答。我得到你的解释。我打印出来看看它是怎样的。但列名是tkinter gui应用程序中的下拉列表。因此取决于选择哪个名称,它将与日期一起插入到表格中,从而进行字符串插值。有没有办法解决它? – TBright

+0

@TBright:我的答案的后半部分应该帮助你。您需要注意在UI中选择了所有必需的列。 – mhawke

+0

我试过了,但没有奏效。我的表只有一个日期列,其余列是颜色。表格中的输入字段是从UI接收到的数量,然后查找所选的特定颜色并将其保存在具有日期的列下。当我尝试你的答案时,它试图寻找不在我桌子上的列。 – TBright