from sqlalchemy import *

meta = BoundMetaData('sqlite://', echo=True)

users = Table('users', meta,
    Column('user_id', Integer, primary_key = True),
    Column('user_name', String(40)))

addresses = Table('addresses', meta,
    Column('address_id', Integer, primary_key = True),
    Column('street', String(100)))

user_address = Table('user_address', meta,
    Column('user_id', Integer, ForeignKey('users.user_id'),  
primary_key=True),
    Column('address_id', Integer, ForeignKey('addresses.address_id'),
primary_key=True))

meta.create_all()

class User(object): pass

mapper(User, users)

s = create_session().query(User).select_by 
(users.c.user_id==user_address.c.user_id, user_address.c.address_id==1)


On Jun 10, 2006, at 12:03 PM, Yuan HOng wrote:

> Having read the relavant section in the docs on this topic and made
> some experimentations, I still have no clue how I can achieve the
> following task:
>
> Suppose we have a many-to-many relationship between the table users  
> and address:
>
> users = Table('users', engine,
>    Column('user_id', Integer, primary_key = True),
>    Column('user_name', String(40)))
>
> addresses = Table('addresses', engine,
>    Column('address_id', Integer, primary_key = True),
>    Column('street', String(100)))
>
> user_address = Table('user_address', engine,
>    Column('user_id', Integer, ForeignKey('users.user_id'),  
> primary_key=True),
>    Column('address_id', Integer, ForeignKey('addresses.address_id'),
> primary_key=True))
>
> class User(object): pass
>
> Now I'd like to select all users with address_id x and map them to
> class User. I attemped to build a select like this:
>
> s = select([users], users.c.user_id==user_address.c.user_id)
>
> and then define a mapper like in the example in documentation:
>
> m = mapper(User, s)
>
> This causes an error:
>
> ArgumentError: Mapping against a Select object requires that it has a
> name.  Use an alias to give it a name, i.e. s =
> select(...).alias('myselect')
>
> Apparently the syntax in the example doesn't work as is. I added an
> alias to the select:
>
> m = mapper(User, s.alias('myselect'))
>
> But I still can't use the mapper to generate the SQL code I expected.
> The SQL generated for
>
> m.select_by(user_address.c.address_id == 1)
>
> is
>
> 'SELECT myselect.user_name AS myselect_user_name, myselect.user_id AS
> myselect_user_id \nFROM user_address, (SELECT users.user_id AS
> user_id, users.user_name AS user_name \nFROM users \nWHERE
> users.user_id = user_address.user_id) AS myselect \nWHERE
> user_address.address_id = %(user_address_address_id)s'
> {'user_address_address_id': 1}
>
> whereas I would expect the SQL to be something like:
>
> SELECT users.user_name, users.user_id FROM users, user_address WEHRE
> users.user_id = user_address.user_id and user_address.address_id = 1
>
> What's the correct way to do this in SA?
>
> Thanks.
> -- 
> Hong Yuan
>
> 大管家网上建材超市
> 装修装潢建材一站式购物
> http://www.homemaster.cn
> _______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users



_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to