我有一个脚本可以做两件事: 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文件(如果需要,我可以分享它)。
我认为问题可能在第二个查询的语法上。这个查询从交易表中获取一个描述字符串,并查看它是否有来自另一个映射表的任何子字符串。当匹配发生时,它会提取其他字段并将它们复制回交易表。
请问有人可以帮我找到正确的方法吗?
提前感谢
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
好的,经过一番研究,我找到了错误。
我的直觉是对的,这是一个脚本错误。正确的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操作符中包含子字符串比较。