J'ai une table avec environ 200 colonnes. Je dois effectuer un vidage des données de transaction quotidiennes à des fins ETL. C'est une base de données MySQL. J'ai essayé cela avec Python en utilisant à la fois une trame de données pandas ainsi qu'une méthode d'écriture de base dans un fichier CSV. J'ai même essayé de rechercher la même fonctionnalité en utilisant un script shell. J'en ai vu un pour Oracle Database utilisant sqlplus. Voici mes codes python avec les deux approches:
Utilisation des pandas:
import MySQLdb as mdb
import pandas as pd
host = ""
user = ''
pass_ = ''
db = ''
query = 'SELECT * FROM TABLE1'
conn = mdb.connect(host=host,
user=user, passwd=pass_,
db=db)
df = pd.read_sql(query, con=conn)
df.to_csv('resume_bank.csv', sep=',')
En utilisant l'écriture de fichier python de base:
import MySQLdb
import csv
import datetime
currentDate = datetime.datetime.now().date()
host = ""
user = ''
pass_ = ''
db = ''
table = ''
con = MySQLdb.connect(user=user, passwd=pass_, host=host, db=db, charset='utf8')
cursor = con.cursor()
query = "SELECT * FROM %s;" % table
cursor.execute(query)
with open('Data_on_%s.csv' % currentDate, 'w') as f:
writer = csv.writer(f)
for row in cursor.fetchall():
writer.writerow(row)
print('Done')
Le tableau contient environ 300 000 enregistrements. Cela prend trop de temps avec les deux codes python.
De plus, il y a un problème avec l'encodage ici. Le jeu de résultats DB contient des caractères latin-1 pour lesquels je reçois des erreurs comme: UnicodeEncodeError: 'ascii' codec can't encode character '\x96' in position 1078: ordinal not in range(128).
Je dois enregistrer le CSV au format Unicode. Pouvez-vous s'il vous plaît m'aider avec la meilleure approche pour effectuer cette tâche.
Une solution basée sur Unix ou Python fonctionnera pour moi. Ce script doit être exécuté quotidiennement pour vider les données quotidiennes.
3 réponses
Pour ce faire, il vous suffit d'utiliser MySql. Par exemple:
SELECT * FROM your_table WHERE...
INTO OUTFILE 'your_file.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FIELDS ESCAPED BY '\'
LINES TERMINATED BY '\n';
Si vous avez besoin de planifier votre requête, placez une telle requête dans un fichier (par exemple, csv_dump.sql) anche créez une tâche cron comme celle-ci
00 00 * * * mysql -h your_host -u user -ppassword < /foo/bar/csv_dump.sql
Vous pouvez utiliser mysqldump
pour cette tâche. (Source pour la commande)
mysqldump -u username -p --tab -T/path/to/directory dbname table_name --fields-terminated-by=','
Les arguments sont les suivants:
-u username
pour le nom d'utilisateur-p
pour indiquer qu'un mot de passe doit être utilisé-ppassword
pour donner le mot de passe via la ligne de commande--tab
Produire des fichiers de données séparés par des tabulations
Pour les commutateurs de ligne de commande mor, voir https://dev.mysql.com/ doc / refman / 5.5 / en / mysqldump.html
Pour l'exécuter régulièrement, créez une tâche cron comme écrit dans les autres réponses.
Pour les chaînes, cela utilisera le codage de caractères par défaut qui se trouve être ASCII, et cela échoue lorsque vous avez des caractères non ASCII. Vous voulez unicode au lieu de str.
rows = cursor.fetchall()
f = open('Data_on_%s.csv' % currentDate, 'w')
myFile = csv.writer(f)
myFile.writerow([unicode(s).encode("utf-8") for s in rows])
fp.close()
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.