I apologize for this second, longer, more detailed, post, but I
thought my first response
to the request for more descriptions was incomplete...

On May 22, 3:08 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> a1.join(a2, <onclause>) should do it.  if not, supply a full test case  
> and a description of the specific problem.

The database tables were defined elsewhere, via
code like this:

nis_user = Table('nis_users', meta,
    Column('id', Integer, primary_key = True),
    Column('eid', String(32), default=""),
    Column('uid', Integer, nullable = False),
    Column('uname', String(256), nullable = False),
    UniqueConstraint('eid', 'uid', 'uname')
)

nis_account = Table('nis_accounts', meta,
    Column('id', Integer, primary_key = True),
    Column('domain_id', Integer, ForeignKey('domains.id')),
    Column('nis_user_id', Integer, nullable = False),
    Column('gid', Integer, default=60001),
    Column('gcos', String(256)),
    Column('shell', String(256)),
    Column('home', String(256)),
    Column('terminated', Boolean, default = False),
    Column('reassigned_uid', Boolean, default = False),
    Column('active', Boolean, default = True),
    UniqueConstraint('domain_id', 'nis_user_id'),
    ForeignKeyConstraint(['nis_user_id'],['nis_users.id'],
ondelete="CASCADE")
)
So here's the Python Code:

nis_users_table = Table('nis_users', metadata, autoload=True)
nis_accounts_table = Table('nis_accounts', metadata, autoload=True)

class NisAccount(object):
   pass

class NisUser(object):
    pass

mapper(NisUser, nis_users_table, properties = {
        'accounts':relation(NisAccount,
        primaryjoin=nis_users_table.c.id ==
nis_accounts_table.c.nis_user_id,
        backref='user',
        lazy=False)
    },
    order_by = nis_users_table.c.uid
)

mapper(NisAccount, nis_accounts_table, properties={
        'uid' : column_property(
            select(
                [nis_users_table.c.uid],
                nis_users_table.c.id ==
nis_accounts_table.c.nis_user_id
            ).correlate(nis_accounts_table).label('uid')
        ),
        'uname' : column_property(
            select(
                [nis_users_table.c.uname],
                nis_users_table.c.id ==
nis_accounts_table.c.nis_user_id
            ).correlate(nis_accounts_table).label('uname')
        ),
        'eid' : column_property(
            select(
                [nis_users_table.c.eid],
                nis_users_table.c.id ==
nis_accounts_table.c.nis_user_id
            ).correlate(nis_accounts_table).label('eid')
        )
    }
)

So, when I do

s = select([nis_accounts_table, nis_users_table],
from_obj=[nis_accounts_table.join(nis_users_table)]).where(nis_users_table.
c.eid != '')

I get the SQL query I expect.

Then I do:

a1 = s.correlate(None).alias()
a2 = s.correlate(None).alias()

Now, trying to make a new select:

s2 = select(from_obj=[a1.join(a2), a1.c.eid == a2.c.eid])

Gives me a <sqlalchemy.sql.expression.Select ...> object

When I do:

print s2

I get:

Traceback (most recent call last):
   File "<console>", line 1, in ?
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/expression.py", line
1136,
in __str__
     return unicode(self.compile()).encode('ascii',
'backslashreplace')
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/expression.py", line
1132,
in compile
     compiler.compile()
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/compiler.py", line 181,
in
compile
     self.string = self.process(self.statement)
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/compiler.py", line 189,
in
process
     return meth(obj, **kwargs)
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/compiler.py", line 491,
in
visit_select
     froms = select._get_display_froms(existingfroms)
   File "/Users/jeff/src/web/uuid-tg/lib/python2.4/site-packages/
SQLAlchemy-0.4.6-py2.4.egg/sqlalchemy/sql/expression.py", line
3034,
in _get_display_froms
     toremove = itertools.chain(*[f._hide_froms for f in froms])
AttributeError: '_BinaryExpression' object has no attribute
'_hide_froms'


So the question is twofold:

1. What am I doing wrong?

2. How do I see the SQL that would be generated if I'm doing nothing
wrong?

Jeff.



--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to