在下面的示例中,有兩個資料幀 df 和 df1。我還有一個帶有兩個表的 MySQL 資料庫。表 1 和表 2 都具有與 df 相同的列。
我想做的是:
- 使用 df1 在 table1 中找到正確的行,
- 將該行移動到 table2 并更新列“REMOVED”(從 False 到 True)和“REMOVED_DATE”(從 None 到 '2022-01-10)。
- 從 table1 中洗掉行
下面你看到我的努力。但它不起作用,我可以想象有更好的解決方案可用。任何幫助將非常感激。
df=pd.DataFrame({'ID':[25, 10],
'DATE':['2021-11-13', '2021-12-03'],
'LOC': ['NY', 'ML'],
'MAIL':['[email protected]', '[email protected]'],
'NR': ['100000', '200000'],
'REMOVED': [False, False],
'REMOVED_DATE':[None,None]})
df1=pd.DataFrame({'ID':[25],
'REMOVED':[True],
'REMOVED_DATE':['2022-01-11']})
cols = "`,`".join([str(i) for i in df.columns.tolist()]) #use df to mirror the columns in the tables in the database.
for i, row in df1.iterrows():
id=row['ID']
sql=f"SELECT ID FROM table1 WHERE id={id}" # Check if ID is in table1.
cursor.execute(sql)
z=cursor.fetchall()
if not z:
print('insert') # if not, move on.
else: #If ID in, update, move and delete
sql=f"""UPDATE table1 SET (`" cols "`) VALUES (" "%s,"*(len(row)-1) "%s) WHERE id={id}""" # Update the whole row where ID match.
cursor.execute(sql, tuple(row))
mydb.commit()
sql=f"""INSERT INTO table2 SELECT * FROM table1 WHERE id={id}""" #insert it into table2
cursor.execute(str(sql), tuple(row))
mydb.commit()
sql=f"""DELETE from table1 WHERE id={id}""" # Delete it from table1
cursor.execute(sql)
mydb.commit()
uj5u.com熱心網友回復:
您不需要更新table1- 規范中沒有任何內容表明需要更新,無論如何您都將洗掉它。
您的代碼不會更改REMOVED,并且REMOVED_DATE當它從復制table1到table2. 您可以通過替換SELECT *為選擇除這些列之外的所有列并替換SELECT串列中所需的新值來執行此操作。
您還應該使用引數化查詢,而不是用 f 字串替換值。
cols = ",".join(f"`{col}`" for col in df.columns.tolist())
new_cols = ",".join('%s' if col in ('REMOVED', 'REMOVED_DATE') else f"`{col}`" for col in df.columns.tolist())
insert_sql=f"""INSERT INTO table2 ({cols}) SELECT {new_cols} FROM table1 WHERE id=%s""" #insert it into table2
delete_sql = """DELETE from table1 WHERE id=%s"""
select_sql = "SELECT ID FROM table1 WHERE id=%s"
for i, row in df1.iterrows():
id=row['ID']
cursor.execute(select_sql, (id,))
row = cursor.fetchone()
if not row:
print('insert') # if not, move on.
else: #If ID in, update, move and delete
cursor.execute(insert_sql, (False, '2022-01-10', id))
cursor.execute(delete_sql, (id,))
mydb.commit()
在移動和洗掉時,您應該為每組操作只提交一次,以便它們是一個原子集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/419734.html
標籤:
上一篇:MySQL似乎更新速度很慢
下一篇:MySQL表中的默認NULL條目
