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.

1
amulya349 13 avril 2018 à 12:44

3 réponses

Meilleure réponse

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
2
floatingpurr 13 avril 2018 à 10:24

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.

1
rollstuhlfahrer 13 avril 2018 à 11:11

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()
2
Jay Shankar Gupta 13 avril 2018 à 09:50