搜索

首页  >  问答  >  正文

按顺序在MySQL中运行2个查询的方法:使用cursor.execute

我有一个脚本可以做两件事: 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粉952365143P粉952365143444 天前510

全部回复(1)我来回复

  • P粉403821740

    P粉4038217402023-09-09 16:12:15

    好的,经过一番研究,我找到了错误。

    我的直觉是对的,这是一个脚本错误。正确的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操作符中包含子字符串比较。

    回复
    0
  • 取消回复