refine use of joinedload

- use it fewer places
- mostly on queries, not attributes
- add innerjoin for some backrefs
This commit is contained in:
Min RK
2023-06-30 11:03:53 +02:00
parent 90ca77194d
commit 38126ecfe1

View File

@@ -331,7 +331,7 @@ class Spawner(Base):
id = Column(Integer, primary_key=True, autoincrement=True) id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE')) user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'))
user = relationship("User", back_populates="_orm_spawners", lazy="joined") user = relationship("User", back_populates="_orm_spawners")
server_id = Column(Integer, ForeignKey('servers.id', ondelete='SET NULL')) server_id = Column(Integer, ForeignKey('servers.id', ondelete='SET NULL'))
server = relationship( server = relationship(
@@ -413,7 +413,6 @@ class Service(Base):
server = relationship( server = relationship(
Server, Server,
back_populates="service", back_populates="service",
lazy="joined",
single_parent=True, single_parent=True,
cascade="all, delete-orphan", cascade="all, delete-orphan",
) )
@@ -569,7 +568,7 @@ class Hashed(Expiring):
`kind='service'` only returns API tokens for services `kind='service'` only returns API tokens for services
""" """
prefix_match = cls.find_prefix(db, token).options( prefix_match = cls.find_prefix(db, token).options(
joinedload(cls.user), joinedload(User.roles) joinedload(cls.user), joinedload(cls.service)
) )
for orm_token in prefix_match: for orm_token in prefix_match:
@@ -607,11 +606,9 @@ class APIToken(Hashed, Base):
nullable=True, nullable=True,
) )
user = relationship("User", back_populates="api_tokens", lazy="joined") user = relationship("User", back_populates="api_tokens")
service = relationship("Service", back_populates="api_tokens", lazy="joined") service = relationship("Service", back_populates="api_tokens")
oauth_client = relationship( oauth_client = relationship("OAuthClient", back_populates="access_tokens")
"OAuthClient", back_populates="access_tokens", lazy="joined"
)
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
hashed = Column(Unicode(255), unique=True) hashed = Column(Unicode(255), unique=True)
@@ -818,14 +815,20 @@ class OAuthCode(Expiring, Base):
client_id = Column( client_id = Column(
Unicode(255), ForeignKey('oauth_clients.identifier', ondelete='CASCADE') Unicode(255), ForeignKey('oauth_clients.identifier', ondelete='CASCADE')
) )
client = relationship("OAuthClient", back_populates="codes", lazy="joined") client = relationship(
"OAuthClient",
back_populates="codes",
)
code = Column(Unicode(36)) code = Column(Unicode(36))
expires_at = Column(Integer) expires_at = Column(Integer)
redirect_uri = Column(Unicode(1023)) redirect_uri = Column(Unicode(1023))
session_id = Column(Unicode(255)) session_id = Column(Unicode(255))
# state = Column(Unicode(1023)) # state = Column(Unicode(1023))
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE')) user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'))
user = relationship("User", back_populates="oauth_codes", lazy="joined") user = relationship(
"User",
back_populates="oauth_codes",
)
scopes = Column(JSONList, default=[]) scopes = Column(JSONList, default=[])
@@ -839,6 +842,10 @@ class OAuthCode(Expiring, Base):
db.query(cls) db.query(cls)
.filter(cls.code == code) .filter(cls.code == code)
.filter(or_(cls.expires_at == None, cls.expires_at >= cls.now())) .filter(or_(cls.expires_at == None, cls.expires_at >= cls.now()))
.options(
# load user with the code
joinedload(cls.user, innerjoin=True),
)
.first() .first()
) )
@@ -861,10 +868,14 @@ class OAuthClient(Base):
return self.identifier return self.identifier
spawner = relationship( spawner = relationship(
"Spawner", back_populates="oauth_client", uselist=False, lazy="joined" "Spawner",
back_populates="oauth_client",
uselist=False,
) )
service = relationship( service = relationship(
"Service", back_populates="oauth_client", uselist=False, lazy="joined" "Service",
back_populates="oauth_client",
uselist=False,
) )
access_tokens = relationship( access_tokens = relationship(
APIToken, back_populates='oauth_client', cascade='all, delete-orphan' APIToken, back_populates='oauth_client', cascade='all, delete-orphan'