我有一个大约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也是可以接受的。
答案 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
这比出口/进口方式要慢得多。