Python-从一个数据库批量选择然后插入到另一个数据库

4

我正在寻找使用sqlite3在Python中执行此操作的帮助。

基本上,我的过程会下载一个临时数据库,然后需要将其记录插入到第二个完全相同的数据库(主数据库)中,同时忽略/跳过任何可能的重复键错误。

我考虑了两种情况,但不确定如何在Python中最好地执行此操作。

选项1:

  • create 2 connections and cursor objects, 1 to each DB
  • select from DB 1 eg:

    dbcur.executemany('SELECT * from table1')
    rows = dbcur.fetchall()
    
  • insert them into DB 2:

    dbcur.execute('INSERT INTO table1 VALUES (:column1, :column2)', rows)
    dbcon.commit()
    

当然这是不起作用的,因为我不确定如何正确做这件事 :)

选项2(我更喜欢的选项,但不确定如何做):

  • 在1个语句中进行SELECT和INSERT

此外,我在数据库中有4个表,每个表的列都不同,我可以在INSERT语句中跳过命名列吗?

至于重复键,我已经阅读了可以使用“ON DUPLICATE KEY”来处理,例如。

INSERT INTO table1 VALUES (:column1, :column2) ON DUPLICATE KEY UPDATE set column1=column1

这个问题太宽泛了。就我所知,选项2是不可能的,你应该选择选项1。如果有问题,请尝试使用选项1并发布代码。 - pajton
我的测试代码基本上就是我为选项1编写的代码 - 表格和列名更改以使我的帖子简单化。我尝试按照那样做时会出现错误 - “ValueError:参数不受支持的类型”。因此,我认为我没有以正确的格式传递值。 - MikeM
啊..我应该更新一下,说我的选项1确实可行(我在代码中有些愚蠢的东西与之冲突).. unutbu的答案是我首选的选择,而且完美地运作! - MikeM
2个回答

6
你可以使用以下代码将ATTACH两个数据库连接到同一个连接中:
import sqlite3
connection = sqlite3.connect('/path/to/temp.sqlite')
cursor=connection.cursor()
cursor.execute('ATTACH "/path/to/main.sqlite" AS master')

在SQLite中没有像MySQL中的ON DUPLICATE KEY语法。这个SO问题包含了一些替代方案。
因此,要在一个SQL语句中执行批量插入,您可以使用类似以下的语句:
cursor.execute('INSERT OR REPLACE INTO master.table1 SELECT * FROM table1')

参见此页面了解REPLACE等其他ON CONFLICT选项的信息。


非常好,谢谢!我应该注意到,在测试时,我不能使用“main”作为我的附加数据库的名称,必须是保留字 - “OperationalError:database main is already in use”。 - MikeM
我也尝试使用INSERT OR IGNORE,并观察它在我的测试数据中的表现,我认为这是我首选的路线,因为主数据库中的数据可能已经稍作修改,我不想失去这些更改...感谢提供链接,非常有帮助! - MikeM

0

选项1的代码看起来正确。

如果您需要过滤掉重复键,可以将插入操作执行到临时表中,然后使用SQL命令消除重复项并将其合并到目标表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接