使用Python中的其他SQlite3数据库更新SQlite3数据库

时间:2018-04-26 14:34:24

标签: python sqlite

我有两个SQlite数据库" archive_db"和" recent_db"用同样的表。 我想更新" archive_db"的内容。使用" recent_db"的内容。 我试过了:

dbconn_archive = sqlite3.connect(archive_db)
dbconn_recent = sqlite3.connect(recent_db)
query = "".join(line for line in dbconn_recent.iterdump())
dbconn_archive.executescript(query)

但这不起作用,因为archive_db中已存在表。

那么更新的正确查询是什么" archive_db"用" recent_db" ?

1 个答案:

答案 0 :(得分:0)

您使用的方法适用于从头开始从现有数据库创建新数据库。我可以想到更新数据库的最佳方法实际上需要更多的代码。

  1. 您必须确定recent_db
  2. 中的表格
  3. 遍历recent_db中的可用表列表:
    • 将记录从recent_db附加到archive_db
    • 假设您已在archive_db中为列强制执行某种类型的唯一性,则可以捕获SQLite的IntegrityError,并根据唯一性条件跳过表中已存在的记录
  4. 注意:我将假设recent_db中的所有表格也存在于archive_db中。如果没有,那么您将不得不进行额外的检查以在archive_db中创建新表,但这不属于此问题的范围。我还会假设您并不真的想要更新sqlite_sequence表,因为它是用于跟踪ROWID的内部表。最后,我将假设recent_db表格中的列顺序与archive_db相同

    import sqlite3
    
    recent_con = sqlite3.connect('recent.db')
    archive_con = sqlite3.connect('archive.db')
    recent_cur = recent_con.cursor()
    archive_cur = archive_con.cursor()
    
    # table query
    tbl_q = """
    SELECT name
    FROM sqlite_master
    WHERE type='table'
        AND name != 'sqlite_sequence'
    """
    
    tables = [t[0] for t in recent_cur.execute(tbl_q)]
    
    for table in tables:
        for row in recent_cur.execute("SELECT * FROM {}".format(table)):
            try:
                archive_cur.execute("INSERT INTO {} VALUES ({})".format(table, ','.join('?' * len(row))), row)
            except sqlite3.IntegrityError:
                pass  # skip record since unique constraint failed
        archive_con.commit()  # commit inserts
    
    archive_cur.close()
    recent_cur.close()
    archive_conn.close()
    recent_conn.close()