Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add hash to model with primary key #877

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

timvantongeren-minttower
Copy link

@timvantongeren-minttower timvantongeren-minttower commented Apr 4, 2024

This PR adds a hash function to models which contain a primary key relation.
We know that a primary key does indeed offer a unique identifier for the row, and a concat of the primary key fields can thus be used to create a unique string identifying the row.

A use case for this would be the following.
Consider a select on the join of 2 tables, A and B.
In the resulting sequence of tuples, multiple instances of a row of either A or B can be present, as they match multiple times on their counterpart.

The most pythonic way to then retrieve the unique instances / rows of either A or B in the result set would be as follows.

# Retrieving the joined tuples, where A and B have 1 to many relationships.
statement = select(A, B).join(B, A.id == B.id)
result: Sequence[tuple[A,B]] = session.exec(statement).all()

# Unique instances of A
unique_a: list[A] = list(set([a for a, b in result]))

# Unique instances of B
unique_b: list[B] = list(set([b for a, b in result]))

This is currently not possible as the SQLModel class, and the underlying pydantic BaseModel are unhashable.
However, I propose that a SQLModel with properly defined primary keys IS actually hashable, as the primary key defines a unique, hashable property.
This would be in line with the underlying database, as some hash is ofcourse also used in the backend to identify this uniqueness.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants