Maison > Questions et réponses > le corps du texte
J'ai un script qui fait deux choses : a) Il lit un fichier csv (transactions bancaires) et le remplit dans une table de transactions dans une base de données MySQL. b) Mettez à jour les autres colonnes du tableau des transactions en fonction de la description de la transaction mappée au fichier de mappage (catégorie de débit, catégorie de crédit, etc.).
Ce qui suit est mon script
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")
Lorsque j'exécute le script, le premier script - SQL fonctionne parfaitement. Cependant, le deuxième script n'est pas en cours d'exécution ou il n'y a aucune modification dans le tableau.
Je me suis assuré que toutes les tables pertinentes existent dans la base de données. J'ai également formaté correctement le fichier csv (je peux le partager si nécessaire).
Je pense que le problème pourrait provenir de la syntaxe de la deuxième requête. Cette requête prend une chaîne de description de la table de transactions et voit si elle contient des sous-chaînes provenant d'une autre table de mappage. Lorsqu'une correspondance se produit, il extrait les autres champs et les recopie dans la table des transactions.
Quelqu’un peut-il m’aider à trouver la bonne méthode ?
Merci d'avance
P粉4038217402023-09-09 16:12:15
D'accord, après quelques recherches, j'ai trouvé l'erreur.
Mon intuition était juste, c'était une erreur de script. L'instruction de requête SQL correcte est la suivante :
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, '%') """
La clé est d'inclure la comparaison de sous-chaînes dans l'opérateur WHERE
.