Peut sqlalchemy désireux / JOINTES charges sont supprimées une fois mis en place?
-
25-09-2019 - |
Question
J'ai un cas où la plupart du temps, les relations entre les objets est telle que la pré-configuration d'un désireux (joint) charge sur la relation du sens. Mais maintenant, j'ai une situation où je ne veux vraiment pas la charge désireux de se faire.
Dois-je supprimerons la charge jointe de la relation et de changer toutes les questions pertinentes à se joindre à l'emplacement de requête (beurk), ou est-il un moyen de supprimer une charge hâte dans une requête une fois qu'il est mis en place?
Voici un exemple où le chargement désireux a été mis en place sur la utilisateur-> relation d'adresse. la requête à la fin du programme peut être configuré pour se charge pas envie?
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy.orm as orm
##Set up SQLAlchemy for declarative use with Sqlite...
engine = sa.create_engine("sqlite://", echo = True)
DeclarativeBase = declarative_base()
Session = orm.sessionmaker(bind = engine)
class User(DeclarativeBase):
__tablename__ = "users"
id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
name = sa.Column(sa.String, unique = True)
addresses = orm.relationship("Address",
lazy = "joined", #EAGER LOAD CONFIG IS HERE
)
def __init__(self, Name):
self.name = Name
class Address(DeclarativeBase):
__tablename__ = "addresses"
id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
address = sa.Column(sa.String, unique = True)
FK_user = sa.Column(sa.Integer, sa.ForeignKey("users.id"))
def __init__(self, Email):
self.address = Email
##Generate data tables...
DeclarativeBase.metadata.create_all(engine)
##Add some data...
joe = User("Joe")
joe.addresses = [Address("joe@example.com"),
Address("joeyjojojs@example.net")]
s1 = Session()
s1.add(joe)
s1.commit()
## Access the data for the demo...
s2 = Session()
#How to suppress the eager load (auto-join) in the query below?
joe = s2.query(User).filter_by(name = "Joe").one() # <-- HERE?
for addr in joe.addresses:
print addr.address
La solution
Vous pouvez remplacer les propriétés de désir sur une base de requête par requête, pour autant que je me souviens. Est-ce que ce travail?
from sqlalchemy.orm import lazyload
joe = (s2.query(User)
.options(lazyload('addresses'))
.filter_by(name = "Joe").one())
for addr in joe.addresses:
print addr.address
Voir les docs.