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_conndest_conn。改为使用nam

def open_db(nam): 
    conn = sqlite3.connect(nam)