2010-06-26 6 views
2

J'ai une table MySQL avec environ ~ 10m lignes. J'ai créé un schéma parallèle dans SQLite3, et j'aimerais copier la table d'une manière ou d'une autre. Python à l'aide apparaît comme une solution acceptable, mais de cette façon -Python copie la table MySQL à SQLite3

# ... 
mysqlcursor.execute('SELECT * FROM tbl') 
rows = mysqlcursor.fetchall() # or mysqlcursor.fetchone() 
    for row in rows: 
    # ... insert row via sqlite3 cursor 

... est incroyablement lent (se bloque au .execute(), je ne sais pas pour combien de temps).

Je n'aurais à le faire qu'une seule fois, cela ne me dérange donc pas si cela prend quelques heures, mais y a-t-il une autre façon de procéder? L'utilisation d'un outil différent de Python est également acceptable.

Répondre

3

La méthode la plus simple pourrait être d'utiliser mysqldump pour obtenir un fichier SQL de la totalité de la base de données, puis d'utiliser l'outil de ligne de commande SQLite pour exécuter le fichier.

+0

+! convenu, Python n'est pas l'outil que je choisirais pour transférer le contenu de la base de données. –

3

Vous ne montrez pas exactement comment vous insérez des lignes, mais vous mentionnez execute().

Vous pouvez essayer executemany() * à la place.
Par exemple:

import sqlite3 
conn = sqlite3.connect('mydb') 
c = conn.cursor() 
# one '?' placeholder for each column you're inserting 
# "rows" needs to be a sequence of values, e.g. ((1,'a'), (2,'b'), (3,'c')) 
c.executemany("INSERT INTO tbl VALUES (?,?);", rows) 
conn.commit() 

* executemany() comme décrit dans le Python DB-API:

.executemany(operation,seq_of_parameters)
Préparer une opération de base de données (commande requête ou ), puis exécuter contre toutes les séquences de paramètres ou les mappages trouvé dans la séquence seq_of_parameters.

0

Vous pouvez exporter un fichier plat de MySQL en utilisant select dans outfile et importer ceux avec .import SQLite:

mysql> SELECT * INTO OUTFILE '/tmp/export.txt' FROM sometable; 

sqlite> .separator "\t" 
sqlite> .import /tmp/export.txt sometable 

Cela gère l'exportation des données/importation mais pas la copie du schéma, bien sûr. Si vous voulez vraiment faire cela avec python (peut-être pour transformer les données), j'utiliserais un MySQLdb.cursors.SSCursor pour itérer sur les données - sinon le resultset mysql est mis en cache en mémoire, c'est pourquoi votre requête est accrocher sur exécuter. Cela ressemblerait à ceci:

import MySQLdb 
import MySQLdb.cursors 
connection = MySQLdb.connect(...) 
cursor = connection.cursor(MySQLdb.cursors.SSCursor) 
cursor.execute('SELECT * FROM tbl') 
for row in cursor: 
    # do something with row and add to sqlite database 

Ce sera beaucoup plus lent que l'approche d'exportation/importation.

Questions connexes