On Feb 20, 2011, at 8:40 AM, [email protected] wrote: > Hi listmembers, > > i have a problem with a difference i find playing with sqla between > query.count and query.all results. > I have a parent class declaratively mapped to a table in MySQL, there is a > child class with a relationship. > I'm not sure how to create a quick session (i suspect a problem lies there, > but i have no clue) - my usecase is very general, but i am not sure if i have > the lingo right (been reading the docs till blue in the face, didn't know > using this wonderful stuff is so intricate). > > In short i use the following, (productdescriptions depending on languages): > > Session = scoped_session(sessionmaker()) > session = Session(autoflush=True) > > class Products(Base): > products_id = Column(Integer, primary_key=True) > products_loc = Column(String) > product_descriptions = relationship("Products_description", > cascade="all", > backref=backref('product')) > > class Products_description(Base): > products_description_id = Column(Integer, primary_key=True) > products_id = Column(Integer, ForeignKey('products.products_id'), > nullable=False) > language_id = Column(Integer, ForeignKey('languages.languages_id'), > nullable=False) > > class Languages(Base): > languages_id = Column(Integer, primary_key=True) > etc.. > > > I would expect the product_descriptions to hold two objects if there are two > records in de database (for two languages, but that is irrelevant here .. or > is it?), related via the products_id attribute. When i query the database > like so: > > qry = > session.query(Products_description).join(Products).filter(Products_descri > ption.products_id == :someniceproducts_id) > > with some nice existing products_id > > qry.count() results in 2L (like i would expect, there being two > description records in the db for the product) > > but when i issue: > qry.all() > > i only get one object as a result. > > I clearly - after studying the docs - don't understand sqlalchemy at all :) > What am i doing wrong? it looks so easy and straightforward that i find > myself checking my chair twice to be sure it's there before sitting down (..).
count() is going to count rows, not necessarily distinct entities. You have a join in your query so you're going to get multiple Products_description rows with the same identifier, for each related Products. all() gets two rows as well internally, which you'll see if you enable echo='debug' on your engine, but because they have the same primary key identifier for Products_description they are "uniqueified" before being returned. If you queried for both, query(Products_description, Products), the "uniquifying" step is removed and you'd get two entries. > > Can somebody please HELP me :) > Cheers > Freddy > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
