我有两个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" ?
答案 0 :(得分:0)
您使用的方法适用于从头开始从现有数据库创建新数据库。我可以想到更新数据库的最佳方法实际上需要更多的代码。
recent_db
。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()