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