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