【问题标题】:Combine two SQL lite databases with Python将两个 SQLite 数据库与 Python 结合起来
【发布时间】:2021-11-21 12:16:32
【问题描述】:

我在 python 中有以下代码来更新数据库,其中第一列是“id”整数主键自动增量唯一:

con = lite.connect('test_score.db')
with con:
    cur = con.cursor()
    cur.execute("INSERT INTO scores VALUES (NULL,?,?,?)", (first,last,score))
    item = cur.fetchone()
    on.commit()
    cur.close()
    con.close()

我得到包含以下数据的表格“分数”:

1,Adam,Smith,68
2,John,Snow,76
3,Jim,Green,88

两个不同的用户(userA 和 userB)将 test_score.db 和代码复制到他们的计算机上并单独使用。 我找回了两个 db test_score.db 但现在内容不同:

用户 A test_score.db:

1,Adam,Smith,68
2,John,Snow,76
3,Jim,Green,88
4,Jim,Green,91
5,Tom,Hanks,15

用户 A test_score.db:

1,Adam,Smith,68
2,John,Snow,76
3,Jim,Green,88
4,Chris,Prat,99
5,Tom,Hanks,09
6,Tom,Hanks,15

我正在尝试使用

insert into AuditRecords select * from toMerge.AuditRecords; 

将两个 db 合并为一个,但由于第一列是唯一 id 而失败。两个数据库现在具有相同的 ID,但具有不同或相同的数据,并且合并失败。 我想在两个数据库中找到唯一的行(所有值都不同,忽略 id)并将结果合并到一个完整的数据库中。

结果应该是这样的:

1,Adam,Smith,68
2,John,Snow,76
3,Jim,Green,88
4,Jim,Green,91
5,Tom,Hanks,15
6,Chris,Prat,99
7,Tom,Hanks,09

我可以逐个提取每个值并进行比较,但我想避免它,因为将来我可能会有更长的行和更多的列。

对不起,如果问题很简单,我还在学习。我试图找到答案但失败了,如果它已经存在于其他地方,请指点我回答。非常感谢您的帮助。

【问题讨论】:

    标签: python sql database sqlite merge


    【解决方案1】:

    您需要定义解决重复行的方法。会考虑最高分吗?最小?第一个?

    考虑到表AuditRecords有用户A和B的所有行,你可以使用GROUP BY去重,使用聚合函数来解析分数:

    insert into
        AuditRecords
    select
        id,
        first_name,
        last_name,
        max(score) as score
    from
        toMerge.AuditRecords
    group by
        id,
        first_name,
        last_name;
    
    

    【讨论】:

      【解决方案2】:

      对于此要求,您应该为 firstlastscore 列的组合定义 UNIQUE 约束:

      CREATE TABLE AuditRecords(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        first TEXT,
        last TEXT,
        score INTEGER,
        UNIQUE(first, last, score)
      );
      

      现在您可以使用INSERT OR IGNORE 来合并表格:

      INSERT OR IGNORE INTO AuditRecords(first, last, score) 
      SELECT first, last, score 
      FROM toMerge.AuditRecords;
      

      请注意,您必须明确定义将接收值的列的列表,并且在此列表中缺少 id,因为它的值将在每次插入时自动递增。

      不定义UNIQUE 约束的另一种方法是使用EXCEPT

      INSERT INTO AuditRecords(first, last, score) 
      SELECT first, last, score FROM toMerge.AuditRecords
      EXCEPT
      SELECT first, last, score FROM AuditRecords
      

      【讨论】:

        猜你喜欢
        • 2019-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 2020-11-02
        相关资源
        最近更新 更多