Sqlalchemy beitreten und filternPython

Python-Programme
Anonymous
 Sqlalchemy beitreten und filtern

Post by Anonymous »

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>

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
- ok
[*]

Code: Select all

if userId in list(map(lambda member: member.id, SetEntity.members))
- Ich weiß nicht, wie ich es lösen und in Filterfunktion schreiben soll: (
[/list]
Zum Beispiel:
  • Code: Select all

    getAvailableSets(session, 1) -> [SetEntity(id=1, ...)]
  • Code: Select all

    getAvailableSets(session, 3) -> [SetEntity(id=1, ...), SetEntity(id=2, ...)]
Gibt es eine Option, dies zu tun?
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};

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post