【问题标题】:Python sqlite copy table from one database to anotherPython sqlite 将表从一个数据库复制到另一个数据库
【发布时间】:2013-05-12 12:18:29
【问题描述】:

我在 Windows XP 上使用带有内置 sqlite3 模块的 python 2.7。代码如下所示:

#!/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

源和目标数据库连接似乎在某个地方混合在一起?我已经调试了好几个小时没有找到原因。

【问题讨论】:

    标签: python sqlite pysqlite


    【解决方案1】:

    您忽略了nam 参数并使用sys.argv[1] 进行所有对open_db() 的调用:

    def open_db(nam):
        conn = sqlite3.connect(sys.argv[1])
    

    这会以src_conndest_conn 的形式打开第一个命名数据库两次。请改用nam

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多