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

2024-06-24 13:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个SQlite数据库“archive\u db”和“recent\u 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)

但这不起作用,因为这些表已经存在于存档数据库中。你知道吗

那么用“最近的数据库”更新“存档数据库”的正确查询是什么呢?你知道吗


Tags: in数据库内容fordbsqliteconnectline
1条回答
网友
1楼 · 发布于 2024-06-24 13:32:31

您使用的方法非常适合从头开始从现有数据库创建新数据库。我能想到的更新数据库的最佳方法实际上需要更多的代码。你知道吗

  1. 您必须确定recent_db中有哪些表。你知道吗
  2. 遍历recent_db中可用表的列表:
    • 将记录从recent_db追加到archive_db
    • 假设您对archive_db中的列强制了某种类型的唯一性,您可以捕获SQLite的IntegrityError,并根据唯一性条件跳过表中已经存在的记录

注意:我假设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()

相关问题 更多 >