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)
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**
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"])
3 Réponses :
essayez ce doc vous devez créer une connexion, puis écrire des données dans votre base de données.
En situation idéale pour toute opération de base de données dont vous avez besoin:
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 .
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()
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.
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.
Le code ci-dessous effectue les actions suivantes:
base de données MySQL (connexion) créé. 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
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']
['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']
"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"
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)
C'est une approche de longue haleine. Cependant, chaque étape a été décomposée intentionnellement pour montrer clairement les étapes impliquées.
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?