Skip to content

Should upsert() work with compound primary key? #629

@jclark-dot-org

Description

@jclark-dot-org

Given this table:

create table main.summary (
    Source      TEXT,
    Object      TEXT,
    Category    TEXT,
    Count       INTEGER,
    primary key (Source, Object, Category)
)

I'd like to have a simple helper to run rollups like so:

def summarize(db, table, source, object_name, category='All', criteria=None):
    db['summary'].upsert({
        'source': source,
        'object': object_name,
        'category': category,
        'count': table.count_where(criteria)
    })

To use like so:

utils.summarize(db, db["accounts_a"], 'Client A', 'Accounts')
utils.summarize(db, db["accounts_b"], 'Client B', 'Accounts', 'Customer', 'Type = "Customer"')
utils.summarize(db, db["accounts_b"], 'Client B', 'Accounts', 'Prospect', 'Type = "Prospect"')

But I'm getting an error that upsert requires a pk:

  File "/Users/jclark/Documents/dev/clientname/merge/scripts/utils.py", line 13, in summarize
    db['summary'].upsert({
  File "/opt/homebrew/lib/python3.12/site-packages/sqlite_utils/db.py", line 3346, in upsert
    return self.upsert_all(
           ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/sqlite_utils/db.py", line 3383, in upsert_all
    return self.insert_all(
           ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/sqlite_utils/db.py", line 3237, in insert_all
    raise PrimaryKeyRequired("upsert() requires a pk")
sqlite_utils.db.PrimaryKeyRequired: upsert() requires a pk

Per the upsert docs, the pk param to upsert() is only used when creating the target table, which I am not, so I'm assuming the error means it doesn't like my pk. Is that because it's a compound key? Or am I doing something else wrong?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions