Maison  >  Questions et réponses  >  le corps du texte

Façon d'exécuter 2 requêtes dans MySQL de manière séquentielle : en utilisant curseur.execute

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粉952365143P粉952365143428 Il y a quelques jours500

répondre à tous(1)je répondrai

  • P粉403821740

    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.

    répondre
    0
  • Annulerrépondre