Python将MySQL表复制到SQLite3

时间:2010-06-26 14:17:49

标签: python mysql database sqlite

我有一个大约10米行的MySQL表。我在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 个答案:

答案 0 :(得分:3)

最简单的方法可能是使用mysqldump获取整个数据库的SQL文件,然后使用SQLite命令行工具执行该文件。

答案 1 :(得分:3)

您没有准确显示插入行的方式,但提到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。

答案 2 :(得分:0)

您可以使用select into outfile从mysql导出平面文件,并使用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

这比出口/进口方式要慢得多。