Python sqlite copy table from one database to another

10,426

You are ignoring the nam parameter and using sys.argv[1] for all calls to open_db():

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

This opens the first named database twice, as both src_conn and dest_conn. Use nam instead:

def open_db(nam):
    conn = sqlite3.connect(nam)
Share:
10,426
Ayman
Author by

Ayman

Creator of JSyntaxPane. Working as Consultant and coding for fun.

Updated on July 18, 2022

Comments

  • Ayman
    Ayman almost 2 years

    I'm using python 2.7 with the builtin sqlite3 module on Windows XP. The code looks like the following:

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

    When I run this with db_copy.py src.db dest.db the source database was doubled. So I set the source file attribute to readonly. I now get:

    sqlite3.OperationalError: attempt to write a readonly database
    

    It seems somewhere the source and destination database connections are mixed? I've been debugging this for hours without finding the cause.