Sqlalchemy beitreten und filtern
Posted: 10 Feb 2025, 18:03
Ich bin neu in Sqlalchemy und entwickle eine kleine Fastapi -Anwendung mit SQLALCHEMY und SQLITE. Ich habe mehrere Tabellen, es ist nur ein kleines Beispiel: < /p>
Benutzer: < /p> - ok
[*] - Ich weiß nicht, wie ich es lösen und in Filterfunktion schreiben soll: (
[/list]
Zum Beispiel:
upd. So etwas in SQL: < /p>
Benutzer: < /p>
Code: Select all
class UserEntity(BaseEntity):
"""
User's table
"""
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True, unique=True, nullable=False)
username = Column(String, unique=True, index=True, nullable=False)
password = Column(String, nullable=False)
< /code>
setzt: < /p>
class SetEntity(BaseEntity):
"""
Sets
"""
__tablename__ = "sets"
id = Column(Integer, primary_key=True, autoincrement=True, unique=True, nullable=False)
name = Column(String, nullable=False)
ownerId = Column("owner_id", Integer, ForeignKey("users.id"), nullable=False, comment="Creator's id")
owner = relationship("UserEntity", backref="sets")
members = relationship("UserEntity", secondary=SetMemberEntity)
< /code>
und viele zu viele Tabellen: < /p>
SetMemberEntity = Table(
"set_members",
BaseEntity.metadata,
Column("id", Integer, primary_key=True),
Column("set_id", Integer, ForeignKey("sets.id")),
Column("member_id", Integer, ForeignKey("users.id"))
)
< /code>
Der Prozess des Benutzers ist also: < /p>
[list]
[*] Der Benutzer erstellt einen Satz (der eine neue Zeile in die Sätze < /code> einfügt) < /li>
Der Benutzer fügt einen weiteren Benutzer (per ID) hinzu, die Zugriff auf das in Schritt 1 erstellte Set haben. < /li>
< /ol>
für Beispiel: < /p>
Benutzer: < /p>
< thead>
id < /th>
Benutzername < /th>
Passwort < /th>
< /tr>
< /thead>
1 < /td>
Alice < /td> < Br />3c9...
< /tr>
2 < /td>
Bob < /td>
bb4...
< /tr>
3 < /td>
< td> trent
304...
setzt: < /p>
id < /th>
Name < /th>
Besitzer_id < /th>
< /tr>
< /thead>
1 < /td>
Alice's Set < /td>
1 < /td>
< /tr>
2 < /td>
Bobs Set < /td>
2
sets_members:
id < /th >
set_id < /th>
member_id < /th>
< /tr>
< /thead>
< /thead />
1 < /td>
1 < /td>
2 < /td>
< /tr> < Br />
1 < /td>
1 < /td>
3 < /td>
< /tr>
1 < /td>
2 < /td>
3 < /td>
< /tr >
< /tbody>
< /table> < /div>
Ich muss einen Abfragebilter schreiben, der Sätze zurückgibt, entsprechende Bedingungen: < /p>
def getAvailableSets(session: Session, userId: int) -> list[SetEntity]:
return session.query(SetEntity).join(...).filter(_or(SetEntity.ownerId == userId, ...))
< /code>
if SetEntity.ownerId == userId
[*]
Code: Select all
if userId in list(map(lambda member: member.id, SetEntity.members))
[/list]
Zum Beispiel:
Code: Select all
getAvailableSets(session, 1) -> [SetEntity(id=1, ...)]
Code: Select all
getAvailableSets(session, 3) -> [SetEntity(id=1, ...), SetEntity(id=2, ...)]
upd. So etwas in SQL: < /p>
Code: Select all
select s.* from sets s
left join set_members sm on s.id = sm.set_id
where s.owner_id = {user_id} or sm.member_id = {user_id};