Python的sqlite从一个数据库复制到另一个
问题描述:
我在Windows XP上使用python 2.7与内置的sqlite3模块。代码如下所示:Python的sqlite从一个数据库复制到另一个
#!/usr/bin/env python2
import sqlite3
import sys
def open_db(nam):
conn = sqlite3.connect(sys.argv[1])
# Let rows returned be of dict/tuple type
conn.row_factory = sqlite3.Row
print "Openned database %s as %r" % (nam, conn)
return conn
def copy_table(table, src, dest):
print "Copying %s %s => %s" % (table, src, dest)
sc = src.execute('SELECT * FROM %s' % table)
ins = None
dc = dest.cursor()
for row in sc.fetchall():
if not ins:
cols = tuple([k for k in row.keys() if k != 'id'])
ins = 'INSERT OR REPLACE INTO %s %s VALUES (%s)' % (table, cols,
','.join(['?'] * len(cols)))
print 'INSERT stmt = ' + ins
c = [row[c] for c in cols]
dc.execute(ins, c)
dest.commit()
src_conn = open_db(sys.argv[1])
dest_conn = open_db(sys.argv[2])
copy_table('audit', src_conn, dest_conn)
当我跑这跟db_copy.py src.db dest.db
源数据库增加了一倍。所以我将源文件属性设置为只读。我现在得到:
sqlite3.OperationalError: attempt to write a readonly database
看来某处的源和目标数据库连接混合?我已经调试了几个小时而没有找到原因。
答
你忽略了nam
参数,并使用sys.argv[1]
所有来电open_db()
:
这将打开第一个命名数据库两次,既src_conn
和dest_conn
。改为使用nam
:
def open_db(nam):
conn = sqlite3.connect(nam)