mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
SQLAlchemy many to one and selection of the last/first child
This commit is contained in:
parent
5f1c37e6e2
commit
ce84ef3224
2 changed files with 40 additions and 1 deletions
|
@ -1 +0,0 @@
|
||||||
{"sorting":"name-down","virtualDirectories":[]}
|
|
40
content/code/2023-10-18-sqlalchemy-many-to-one-queries.md
Normal file
40
content/code/2023-10-18-sqlalchemy-many-to-one-queries.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
title: Using DISTINCT in Parent-Child Relationships
|
||||||
|
headline: How to get parent and most-recent child in a one-to-many relationship
|
||||||
|
tags: SQL, SQLAlchemy, Python
|
||||||
|
---
|
||||||
|
|
||||||
|
Let's say you have a model defined like this, with a Parent and a Child table:
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
class Parent(Base):
|
||||||
|
__tablename__ = "parent"
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
|
||||||
|
childs: Mapped[List["Child"]] = relationship(back_populates="parent")
|
||||||
|
|
||||||
|
|
||||||
|
class Child(Base):
|
||||||
|
__tablename__ = "child"
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
parent_id: Mapped[int] = mapped_column(ForeignKey("parent.id"))
|
||||||
|
parent: Mapped["Parent"] = relationship(back_populates="children")
|
||||||
|
|
||||||
|
born_at: Mapped[datetime] = mapped_column()
|
||||||
|
```
|
||||||
|
|
||||||
|
I've tried many ways, with complex subqueries and the like, before finding out [the DISTINCT SQL statement](https://www.sqlitetutorial.net/sqlite-distinct/).
|
||||||
|
|
||||||
|
So, if you want to retrieve the parent with it's more recent child, you can do it like this:
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
results = (
|
||||||
|
db.query(Parent, Child)
|
||||||
|
.join(Child)
|
||||||
|
.distinct(Parent.id)
|
||||||
|
.order_by(Parent.id, desc(Child.born_at))
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
```
|
Loading…
Reference in a new issue