依序在MySQL中執行2個查詢的方法:使用cursor.execute
P粉952365143
P粉952365143 2023-09-08 17:51:12

我有一個腳本可以做兩件事: a)它讀取一個csv檔案(銀行交易)並將其填入MySQL資料庫中的一個交易表。 b)根據交易描述對應到對應文件(借記類別、貸記類別等),更新交易表中的其他欄位。

以下是我的腳本

import mysql.connector as msql
import pandas as pd
from mysql.connector import Error

transdata = pd.read_csv('updt_stat.csv', index_col=False, delimiter=',')
transdata.fillna(0, inplace=True)
transdata = transdata.sort_values('Txn Date')

try:
    conn = msql.connect(
    host = 'localhost',
    user = 'root',
    password = 'root',
    database = 'npalace'  
    )
    if conn.is_connected:
        cursor = conn.cursor()
        sql = "SET FOREIGN_KEY_CHECKS=0"
        cursor.execute(sql)
        print('Database Connected !')
except Error as e:
    print("Error connecting database", e)

for i,row in transdata.iterrows():
    sql = "INSERT INTO npalace.t_bank_pnb (txn_no, txn_date, descr, branch_name, cheque_no, \
        dr_amount, cr_amount, balance, updated_on) VALUES (%s,STR_TO_DATE(%s,'%d-%m-%Y'),%s,%s,%s,%s,%s,%s,curdate())"
    cursor.execute(sql, tuple(row))
    print('Record Inserted')
    conn.commit() 

sql1 = """
            UPDATE npalace.t_bank_pnb
            JOIN npalace.map_pnb ON npalace.map_pnb.descript LIKE CONCAT('%', npalace.t_bank_pnb.descr, '%')
            SET
                npalace.t_bank_pnb.dr_category = npalace.map_pnb.dr_cat,
                npalace.t_bank_pnb.cr_category = npalace.map_pnb.cr_cat,
                npalace.t_bank_pnb.flat_no = npalace.map_pnb.flat_num
            WHERE npalace.t_bank_pnb.updated_on = CURDATE()
        """   

cursor.execute(sql1)
conn.commit()

conn.close()

print(cursor.rowcount, "record(s) affected")

當我運行腳本時,第一個腳本 - sql 運行得很完美。然而,第二個腳本沒有運行或表中沒有變化。

我確保資料庫中存在所有相關表。我也已經正確格式化了csv檔案(如果需要,我可以分享它)。

我認為問題可能在第二個查詢的語法上。這個查詢從交易表中取得一個描述字串,並查看它是否有來自另一個映射表的任何子字串。當匹配發生時,它會提取其他欄位並將它們複製回交易表。

請問有人可以幫我找到正確的方法嗎?

提前感謝

P粉952365143
P粉952365143

全部回覆(1)
P粉403821740

好的,經過一番研究,我找到了錯誤。

我的直覺是對的,這是一個腳本錯誤。正確的SQL查詢語句如下:

sql1 = """
   UPDATE npalace.t_bank_pnb
   JOIN npalace.map_pnb 
   SET npalace.t_bank_pnb.dr_category = npalace.map_pnb.dr_cat,
       npalace.t_bank_pnb.cr_category = npalace.map_pnb.cr_cat,
       npalace.t_bank_pnb.flat_no = npalace.map_pnb.flat_num
   WHERE npalace.t_bank_pnb.updated_on = CURDATE()
     AND npalace.t_bank_pnb.descr LIKE CONCAT('%', npalace.map_pnb.descript, '%')
"""

關鍵是在WHERE運算子中包含子字串比較。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!