如何使用ON DUPLICATE KEY UPDATE正确增加变量

时间:2017-06-10 21:45:08

标签: python mysql pandas numpy anaconda

短版本:我正在尝试在mysql表中增加一个变量ON DUPLICATE。相反,它只会添加新记录。旧记录保持不变,而不是将sale_date递增1。由于这个脚本每天运行,我试图在昨天(T-1)到今天的shipment_date(T)的重复记录中设置mysql数据库中的sale_date。有什么想法吗?谢谢!

shipment_date = d.date.today().strftime('%Y-%m-%d')

for index, row in df_main_sql.iterrows():
try:
    command = "INSERT INTO **** (stock_number, sale_date, shipment_date) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE sale_date = shipment_date"
    cursor.execute(command, (row['stock_number'], row['sale_date'], row['shipment_date']))
    connection.commit()
    time.sleep(0.1)
except:
    continue
cursor.close() 

其他详细信息:我有一个运行正常的脚本,但有一个例外。我正在尝试将一个pandas数据帧写入mysql。我为一家公司运行这个库存软件,但根据我们在供应链中的位置,我的数据不完整。数据基本上包含stock_number,shipment_date和sale_date。我不知道销售日期,但我可以推断,当一个新的stock_number发生时,它是一个新的货物,当该stock_number不再发生时,销售已经发生,所以我需要该程序每天增加sale_date记录发生,然后在它停止发生时什么也不做。这将告诉我新货物何时到达以及何时售出。您必须与现有数据库进行比较,因为当脚本每天运行时,您无需知道前一天哪些stock_numbers不存在。

第1天的数据库示例

stock_number sale_date shipment_date
1234a         06/06/17  06/06/17
1235a         06/06/17  06/06/17
1236a         06/06/17  06/06/17

第2天的数据库示例,包含当前脚本,一条新记录,没有销售

stock_number sale_date shipment_date
1234a         06/06/17  06/06/17
1235a         06/06/17  06/06/17
1236a         06/06/17  06/06/17
1237a         06/07/17  06/07/17

如果没有销售

,第2天会发生什么
stock_number sale_date shipment_date
1234a         06/07/17  06/06/17
1235a         06/07/17  06/06/17
1236a         06/07/17  06/06/17
1237a         06/07/17  06/07/17

第1天df_main_sql的内容

stock_number sale_date shipment_date
1234a         06/06/17  06/06/17
1235a         06/06/17  06/06/17
1236a         06/06/17  06/06/17

第2天df_main_sql的内容

1234a         06/07/17  06/07/17
1235a         06/07/17  06/07/17
1236a         06/07/17  06/07/17
1237a         06/07/17  06/07/17

1 个答案:

答案 0 :(得分:0)

您没有正确地将数据传递给SQL。

...ON DUPLICATE KEY UPDATE sale_date = shipment_date"

应该是,

...ON DUPLICATE KEY UPDATE sale_date = %s"
cursor.execute(command, (row['stock_number'], row['sale_date'], row['shipment_date'], shipment_date))

有帮助吗?