well, these all do *something*  but I am a little lost on how to frame
these

Session.query(Cookbook).select_from( join
(Cookbook,Keyword,Cookbook.keywords)).all()
## selects id and description from cookbook, but empty set comes back?

Session.query(Cookbook.keywords).select_from( join
(Cookbook,Keyword,Cookbook.keywords)).all()
## ibid

Session.query(Cookbook,Keyword).select_from( join
(Cookbook,Keyword,Cookbook.keywords)).all()
## selects cookbook id, description, and keyword id, name



On Aug 30, 5:02 pm, darkblueB <brian.darkbl...@gmail.com> wrote:
> so I am working through the cookbook many-to-many ORM example on
> zzzeek's blog.
> after executing, Base.metadata.tables looks like this:
>
> {
>
>  'cookbook': Table('cookbook', MetaData(None),
>         Column('id', Integer(), table=<cookbook>, primary_key=True,
> nullable=False),
>         Column('description', Text(length=None, convert_unicode=False,
> assert_unicode=None), table=<cookbook>),
>         schema=None),
>
>  'cookbook_keyword': Table('cookbook_keyword', MetaData(None),
>         Column('cookbook_id', Integer(), ForeignKey('cookbook.id'),
> table=<cookbook_keyword>),
>         Column('keyword_id', Integer(), ForeignKey('keyword.id'),
> table=<cookbook_keyword>),
>         schema=None),
>
>  'keyword': Table('keyword', MetaData(None),
>         Column('id', Integer(), table=<keyword>, primary_key=True,
> nullable=False),
>         Column('name', String(length=255, convert_unicode=False,
> assert_unicode=None), table=<keyword>),
>         schema=None),
>
>  'recipe': Table('recipe', MetaData(None),
>         Column('id', Integer(), table=<recipe>, primary_key=True,
> nullable=False),
>         Column('description', Text(length=None, convert_unicode=False,
> assert_unicode=None), table=<recipe>),
>         schema=None),
>
>  'recipe_keyword': Table('recipe_keyword', MetaData(None),
>         Column('recipe_id', Integer(), ForeignKey('recipe.id'),
> table=<recipe_keyword>),
>         Column('keyword_id', Integer(), ForeignKey('keyword.id'),
> table=<recipe_keyword>),
>         schema=None)
>
> }
>
> the blog post shows some queries set up, all using just the Class
> declarations..
> I added some data, this way
>
> myKwds = []
> for nn in keywords:
>     tk = Keyword()
>     tk.description = nn
>     Session.add(tk)
>
> Session.commit()
>
> myCookbook = Cookbook()
> myCookbook.description = "timely advice on legumes"
> Session.add(myCookbook)
> Session.commit()
>
> so now I should be able to use the many-to-many definition in Cookbook
> thus ?
>
> Session.query(Cookbook.keywords).all()
>
> but that generates only
>
> Session.query(Cookbook.keywords).all()
> 2009-08-30 16:52:26,398 INFO sqlalchemy.engine.base.Engine.0x...cecc
> SELECT cookbook.id AS cookbook_id, cookbook.description AS
> cookbook_description
> FROM cookbook
> 2009-08-30 16:52:26,399 INFO sqlalchemy.engine.base.Engine.0x...cecc
> []
> Out[62]: [(1, u'timely advice on legumes')]
>
> that doesnt look right to me.. nothing about the many-to-many join
> ???
>
> how else ought I be able to use this setup?
>
> ==
>
> #!/usr/bin/python
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
> engine = create_engine('sqlite://', echo=True)
> Session = scoped_session(sessionmaker(bind=engine))
>
> from sqlalchemy.ext.declarative import declarative_base
> Base = declarative_base()
> class Keyword(Base):
>     __tablename__ = "keyword"
>     id = Column(Integer, primary_key=True)
>     name = Column(String(255))
>
> Base.metadata.create_all(engine)
>
> keywords = ["beans", "lentils", "legumes"]
>
> # print Session.query(func.count(Keyword.id)).filter(Keyword.name.in_
> (keywords))
>
> # print Session.query(exists().where(Keyword.name.in_(keywords)))
>
> recipe_keywords = Table("recipe_keyword", Base.metadata,
>                     Column("recipe_id", Integer, ForeignKey
> ("recipe.id")),
>                     Column("keyword_id", Integer, ForeignKey
> ("keyword.id"))
>                     )
>
> cookbook_keywords = Table("cookbook_keyword", Base.metadata,
>                     Column("cookbook_id", Integer, ForeignKey
> ("cookbook.id")),
>                     Column("keyword_id", Integer, ForeignKey
> ("keyword.id"))
>                     )
>
> class Recipe(Base):
>     __tablename__ = "recipe"
>     id = Column(Integer, primary_key=True)
>     description = Column(Text)
>     keywords = relation(Keyword, secondary=recipe_keywords)
>
> class Cookbook(Base):
>     __tablename__ = "cookbook"
>     id = Column(Integer, primary_key=True)
>     description = Column(Text)
>     keywords = relation(Keyword, secondary=cookbook_keywords)
>
> Base.metadata.create_all(engine)
>
> ##-------------------------------------------------------
> ## test
>
> ## spell out the join explicitly
> ##(ret, ), = Session.query(
> ##    exists().where(Recipe.id==recipe_keywords.c.recipe_id).
> ##            where(recipe_keywords.c.keyword_id==Keyword.id).
> ##            where(Keyword.name.in_(keywords))
> ##)
>
> ## use ORM join()
> (ret, ), = Session.query(
>         exists().select_from(join(Recipe, Keyword, Recipe.keywords)).
>                 where(Keyword.name.in_(keywords))
> )
>
> ## use ORM join(), multipe search criteria
> (ret, ), = Session.query(or_(
>         exists().select_from(join(Recipe, Keyword, Recipe.keywords)).
>                 where(Keyword.name.in_(keywords)),
>
>         exists().select_from(join(Cookbook, Keyword,
> Cookbook.keywords)).
>             where(Keyword.name.in_(keywords))
> ))
>
> ## use fancy any().. may have gotchas...
> ## rows = Session.query(Recipe).filter(Recipe.keywords.any
> (Keyword.name.in_(keywords))).all()
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to