Python sqlite3 - 2017年"附近的操作代理

时间:2017-10-05 13:18:56

标签: python sqlite

我是编程新手。我有一个名为dictionary的记录,可以接收各种输入,例如“颜色”,“类型”和“#39;类型”。 '量'等。现在我尝试添加一个Date列,然后插入到sqlite表中,通过' if循环'使用下面的代码。但是我在2017年附近发现了"操作错误,即日期附近。

有人可以帮忙吗?提前致谢

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

1 个答案:

答案 0 :(得分:0)

<强>更新

您可以按如下方式简化代码:

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

然后使用字典的值作为参数执行它。