im suspecting the "add_property" might be screwing it up. any chance of attaching a small working test script ? its tricky to get my head around these glitches too :).

On Feb 21, 2006, at 9:49 AM, dmiller wrote:

On Feb 20, 2006, at 2:54 PM, Michael Bayer wrote:
hey list -

just merged a branch that makes a large modifcation to the eager loading methodology. this change should be an improvement in every regard, in that it simplifies the code for eagerloading and eliminates several user-error scenarios.
...

But, its new code, so all my claims above are subject to the word "should", and please let me know of any strange or buggy behavior that arises.

Here you go (convention: UpperCase=class, camelCaps=SA_table, under_score=DB_table):

assign_mapper(Part, part)

assign_mapper(InheritedPart, inheritedPart, properties=dict(
        part=sa.relation(Part, lazy=False)
))

assign_mapper(Design, design, properties=dict(
        parts=sa.relation(Part, private=True, backref="design"),
inheritedParts=sa.relation(InheritedPart, private=True, backref="design"),
))

assign_mapper(DesignType, designType, properties=dict(
        designs=sa.relation(Design, private=True, backref="type"),
))

Design.mapper.add_property("type", sa.relation(DesignType, lazy=False, backref="designs")) Part.mapper.add_property("design", sa.relation(Design, lazy=False, backref="parts"))
Part.mapper.add_property("designType", sa.relation(DesignType))

x = Design.get(...)
x.inheritedParts


Traceback (most recent call last):
  ...
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/ attributes.py", line 50, in __get__
    return self.manager.get_list_attribute(obj, self.key)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/ attributes.py", line 282, in get_list_attribute
    return self.get_history(obj, key, **kwargs)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/ attributes.py", line 335, in get_history return self.class_managed(obj.__class__)[key](obj, **kwargs).gethistory(passive=passive, **kwargs) File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/ attributes.py", line 201, in gethistory
    value = self.callable_()
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/mapping/ properties.py", line 687, in lazyload result = self.mapper.select(self.lazywhere, order_by=order_by, params=params) File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/mapping/ mapper.py", line 427, in select
    return self.select_whereclause(arg, **kwargs)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/mapping/ mapper.py", line 432, in select_whereclause
    return self.select_statement(statement, **params)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/mapping/ mapper.py", line 445, in select_statement
    return self.instances(statement.execute(**params))
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/sql.py", line 404, in execute
    return c.execute(*multiparams, **params)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/sql.py", line 294, in execute
    return self.engine.execute_compiled(self, params)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/engine.py", line 554, in execute_compiled
    proxy(str(compiled), parameters)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/engine.py", line 549, in proxy self.execute(statement, parameters, connection=connection, cursor=cursor, return_raw=True) File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/engine.py", line 603, in execute
    self._execute(cursor, statement, parameters)
File "/Users/dmiller/Code/SQLAlchemy/lib/sqlalchemy/engine.py", line 618, in _execute
    raise exceptions.SQLError(statement, parameters, e)
SQLError: (ProgrammingError) missing FROM-clause entry for table "part"


# generated SQL:
SELECT ...
FROM inherited_part

    LEFT OUTER JOIN part AS part_b420
        ON part_b420.id = inherited_part.part_id

    LEFT OUTER JOIN design AS design_4c1e
        ON design_4c1e.id = part.design_id

    LEFT OUTER JOIN design_type AS design_type_342b
        ON design_type_342b.id = design_4c1e.design_type_id

WHERE inherited_part.design_id = %(inherited_part_design_id)s


The problem is happening in the ON clause of the JOIN with "design" (ON design_4c1e.id = part.design_id). It's not using the correct alias for "part" (should be using "part_b420").

Aside: in this case it's not even necessary to do the join with "design" since the design has already been loaded (not sure if that could be detected).

~ Daniel


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel? cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users



-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to