1
votes

Ecrire Pandas DataFrame dans une table de base de données MySQL existante

J'ai créé une base de données à l'aide de phpmyadmin appelée test qui contient une table appelée client_info . La table de cette base de données est vide (comme indiqué dans l'image ci-jointe)

entrez la description de l'image ici

De l'autre côté, j'ai écrit un code en python qui lire plusieurs fichiers CSV, puis extraire des colonnes spécifiques dans le dataframe appelé Client_Table1 . Ce dataframe contient plusieurs lignes et 3 colonnes

jusqu'à présent, j'ai écrit ce code:

the expected output in MySQL Database (i.e., **test**), would be

 writing the **Client_ID** column (i.e., values of **Client_ID** column)  into MySQL Database column **code**
 writing the **Client_Name** column into MySQL Database column **name**
 writing the **NACE** column into MySQL Database column **nac**

 un exemple des données Client_Table1 a>

Je voudrais écrire Pandas DataFrame (c'est-à-dire, Client_Table1 ) dans la base de données MySQL existante (c'est-à-dire, tester ) spécifiquement dans le tableau client_info .

import pandas as pd
import glob
path = r'D:\SWAM\ERP_Data'  # Path of Data

all_files = glob.glob(path + "/*.csv")
li = []
 for filename in all_files:
 df = pd.read_csv(filename,sep=';', index_col=None, header=0,encoding='latin-1')
 #df = pd.read_csv(filename, sep='\t', index_col=None, header=0)
 li.append(df)
 ERP_Data = pd.concat(li, axis=0, ignore_index=True)

 # rename the columns name
 ERP_Data.columns = ['Client_ID', 'Client_Name', 'FORME_JURIDIQUE_CLIENT', 'CODE_ACTIVITE_CLIENT', 'LIB_ACTIVITE_CLIENT', 'NACE', 
            'Company_Type', 'Number_of_Collected_Bins', 'STATUT_TI', 'TYPE_TI', 'HEURE_PASSAGE_SOUHAITE', 'FAMILLE_AFFAIRE',
            'CODE_AFFAIRE_MOUVEMENT', 'TYPE_MOUVEMENT_PIECE', 'Freq_Collection', 'Waste_Type', 'CDNO', 'CDQTE', 
            'BLNO', 'Collection_Date', 'Weight_Ton', 'Bin_Capacity', 'REF_SS_REF_CONTENANT_BL', 'REF_DECHET_PREVU_TI', 
            'Site_ID', 'Site_Name', 'Street', 'ADRCPL1_SITE', 'ADRCPL2_SITE', 'Post_Code',
            'City', 'Country','ZONE_POLYGONE_SITE' ,'OBSERVATION_SITE', 'OBSERVATION1_SITE', 'HEURE_DEBUT_INTER_MATIN_SITE', 
            'HEURE_FIN_INTER_MATIN_SITE', 'HEURE_DEBUT_INTER_APREM_SITE', 'HEURE_DEBUT_INTER_APREM_SITE', 'JOUR_PASSAGE_INTERDIT', 'PERIODE_PASSAGE_INTERDIT', 'JOUR_PASSAGE_IMPERATIF',
            'PERIODE_PASSAGE_IMPERATIF']
# extracting specific columns
Client_Table=ERP_Data[['Client_ID','Client_Name','NACE']].copy()
# removing duplicate rows
Client_Table1=Client_Table.drop_duplicates(subset=[ "Client_ID","Client_Name" , "NACE"])


1 commentaires

Avez-vous essayé d'utiliser un insert via sqlalchemy? Lors de l'insertion dans des tableaux existants, je trouve souvent que c'est l'approche préférée. Ou avez-vous l'intention d'utiliser une solution pure pandas?


3 Réponses :


1
votes

essayez ce doc vous devez créer une connexion, puis écrire des données dans votre base de données.


0 commentaires

2
votes

En situation idéale pour toute opération de base de données dont vous avez besoin:

  • Un moteur de base de données
  • Une connexion
  • Créer un curseur à partir de la connexion
  • Créer une instruction SQL d'insertion
  • Lire les données csv ligne par ligne ou toutes ensemble et insérer dans le tableau

C'est juste un concept.

def insert_into_client_info():
    # create cursor
    cursor = connection.cursor()

    # Insert DataFrame recrds one by one.
    sql = "INSERT INTO client_info(code,name, nac) VALUES(%s,%s,%s)"
    for i, row in Client_Table1.iterrows():
        cursor.execute(sql, tuple(row))

        # the connection is not autocommitted by default, so we must commit to save our changes
        connection.commit()
    cursor.close()

def insert_into_any_table():
    "a_cursor"
    "a_sql"
    "a_for_loop"
        connection.commit()
    cursor.close()

## Pile all the funciton one after another
insert_into_client_info()
insert_into_any_table()

# close the connection at the end
connection.close()

C'est juste un concept. Je ne peux pas tester le code que j'ai écrit. Il peut y avoir une erreur. Vous devrez peut-être le déboguer. Par exemple, le type de données ne correspond pas car je considère toutes les lignes comme une chaîne avec% s. Veuillez lire plus en détail ici .

Modifier Basé sur le commentaire:

Vous pouvez créer des méthodes séparées pour chaque table avec une instruction sql, puis les exécuter à la fin. Encore une fois, ce n'est qu'un concept et peut être généralisé davantage.

import pymysql

# Connect to the database
connection = pymysql.connect(host='localhost',
                         user='<user>',
                         password='<pass>',
                         db='<db_name>')


# create cursor
cursor=connection.cursor()

# Insert DataFrame recrds one by one.
sql = "INSERT INTO client_info(code,name, nac) VALUES(%s,%s,%s)"
for i,row in Client_Table1.iterrows():
    cursor.execute(sql, tuple(row))

    # the connection is not autocommitted by default, so we must commit to save our changes
    connection.commit()

connection.close()


2 commentaires

DataPsycho, pourriez-vous me dire où la modification serait si je veux écrire plusieurs dataframe dans plusieurs tables mySQL


@wisam J'ai modifié la réponse en fonction de votre commentaire. Ce n'est qu'un concept et cela peut être plus généralisé. Mais devrait être un flux de travail idéal pour l'automatisation.



2
votes

J'ai écrit cette réponse pour un autre utilisateur ce matin et j'ai pensé que cela pourrait vous aider également.

Ce code lit un fichier CSV et écrit sur MySQL en utilisant pandas et sqlalchemy.

Faites-moi savoir si vous avez besoin de modifications pour vous aider plus spécifiquement.

Réponse:

Le code ci-dessous effectue les actions suivantes:

  • Moteur de base de données MySQL (connexion) créé.
  • Données d'adresse (numéro, adresse) lues à partir d'un fichier CSV.
  • Les virgules de séparation sans champ ont été remplacées par les données source et les espaces supplémentaires ont été supprimés.
  • Données modifiées introduites dans un DataFrame
  • DataFrame utilisé pour stocker des données dans MySQL.
number  address
12345   123 abc street Unit 345
10101   111 abc street Unit 111
20202   222 abc street Unit 222
30303   333 abc street Unit 333
40404   444 abc street Unit 444
50505   abc DR UNIT# 123 UNIT 123

Fichier source ( comma_test.csv ):

['12345', '123 abc street Unit 345']
['10101', '111 abc street Unit 111']
['20202', '222 abc street Unit 222']
['30303', '333 abc street Unit 333']
['40404', '444 abc street Unit 444']
['50505', 'abc DR UNIT# 123 UNIT 123']

Données non éditées: h3>
['12345 ', '123 abc street, Unit 345']
['10101 ', '111 abc street, Unit 111']
['20202 ', '222 abc street, Unit 222']
['30303 ', '333 abc street, Unit 333']
['40404 ', '444 abc street, Unit 444']
['50505 ', 'abc DR, UNIT# 123 UNIT 123']

Données modifiées:

"12345" , "123 abc street, Unit 345"
"10101" , "111 abc street, Unit 111"
"20202" , "222 abc street, Unit 222"
"30303" , "333 abc street, Unit 333"
"40404" , "444 abc street, Unit 444"
"50505" , "abc DR, UNIT# 123 UNIT 123"

Interrogées depuis MySQL:

    import csv
    import pandas as pd
    from sqlalchemy import create_engine

    # Set database credentials.
    creds = {'usr': 'admin',
             'pwd': '1tsaSecr3t',
             'hst': '127.0.0.1',
             'prt': 3306,
             'dbn': 'playground'}
    # MySQL conection string.
    connstr = 'mysql+mysqlconnector://{usr}:{pwd}@{hst}:{prt}/{dbn}'
    # Create sqlalchemy engine for MySQL connection.
    engine = create_engine(connstr.format(**creds))

    # Read addresses from mCSV file.
    text = list(csv.reader(open('comma_test.csv'), skipinitialspace=True))

    # Replace all commas which are not used as field separators.
    # Remove additional whitespace.
    for idx, row in enumerate(text):
        text[idx] = [i.strip().replace(',', '') for i in row]

    # Store data into a DataFrame.
    df = pd.DataFrame(data=text, columns=['number', 'address'])
    # Write DataFrame to MySQL using the engine (connection) created above.
    df.to_sql(name='commatest', con=engine, if_exists='append', index=False)

Remerciements:

C'est une approche de longue haleine. Cependant, chaque étape a été décomposée intentionnellement pour montrer clairement les étapes impliquées.


0 commentaires