Python скопировать таблицу MySQL в SQLite3 - PullRequest
2 голосов
/ 26 июня 2010

У меня есть таблица MySQL с ~ 10м строк. Я создал параллельную схему в SQLite3, и я хотел бы как-то скопировать таблицу. Использование Python кажется приемлемым решением, но этот способ -

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

... невероятно медленно (зависает на .execute(), я не знаю, как долго).

Я бы сделал это только один раз, поэтому я не против, если это займет пару часов, но есть ли другой способ сделать это? Использование другого инструмента вместо Python также допустимо.

Ответы [ 3 ]

3 голосов
/ 27 июня 2010

Вы не показываете, как именно вы вставляете строки, но вы упоминаете execute().

Вместо этого вы можете попробовать executemany()*.
Например:

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() как описано в Python DB-API :

.executemany(operation,seq_of_parameters)
Подготовить операцию базы данных (запрос или команду) и затем выполнить ее для всехпоследовательности параметров или сопоставления, найденные в последовательности seq_of_parameters.

3 голосов
/ 26 июня 2010

Простейшим способом может быть использование mysqldump для получения файла SQL всего БД, а затем использование инструмента командной строки SQLite для запуска файла.

0 голосов
/ 24 сентября 2010

Вы можете экспортировать плоский файл из mysql, используя select в outfile, и импортировать их с помощью sqlite .import:

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

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

Это обрабатывает экспорт / импорт данных, но, конечно, не копирует схему.

Если вы действительно хотите сделать это с python (возможно, для преобразования данных), я бы использовал MySQLdb.cursors.SSCursor для итерации по данным - в противном случае набор результатов mysql кэшируется в памяти, поэтому ваш запрос завис на выполнение. Так что это будет выглядеть примерно так:

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

Это будет намного медленнее, чем экспорт / импорт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...