On Feb 20, 2011, at 3:17 PM, [email protected] wrote: > Hello Michael, > > thank you (all) for sqlalchemy :) > > The "uniquifying" had me spooked, and i am afraid it got me confused > completely about connections, sessions, autoflushing and all the wonderful > toys.
I'm not really sure how uniquifying somehow has to do with sessions and autoflushing. Imagine there's no "uniquifying". Then imagine that query.all() just means, sorted(set([x for x in query])). Does that have some impact on connections or otherwise ? > I now even flush() and commit() directly after every add that's entirely unnecessary. flush is usually automatic and commit() should be called at the end of a transaction (and your app should have some concept of transactions beginning and ending, just as though you made a connection to your database, worked with it, then closed it). > ... (not that it helped, ofc). So, lots of gratitude here for answering me on > a sunday evening (for me). Ppl here all of a sudden thought i was going nuts. > > Back to it, thank you very much. > > cheers > > > -----Original Message----- > From: Michael Bayer <[email protected]> > To: [email protected] > Sent: Sun, Feb 20, 2011 7:30 pm > Subject: Re: [sqlalchemy] difference between query.count() and query.all(), > concurrency? > > > 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. > > -- 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.
