Hi All,
I'm running into a strange problem that I can't seem to constrain to a
test case.  I'm including the relevant pieces of the tables and
relationships as reference for the following description of the
problem.  And, just for reference, I'm running SA from svn.

As you can see below, the Endorsement object is mapped against a
specific select statement on the endorsements table, with a set of
relationships to the EndorsementDefinition and EndorsementLineItem
objects.  Endorsements themselves are children of Policy objects.

The actual ORA error I'm seeing is:
"(DatabaseError) ORA-01446: cannot select ROWID from view with
DISTINCT, GROUP BY, etc."

The select statement itself is too long to relate here, but the
relevant piece is as follows:
"ORDER BY distinct_ends_select.rowid,
uhe_endorsement_7775.end_endorsement_type ASC,
end_endorsement_3b96.end_endorsement_type ASC"

When I've run into 01446 before, I've merely added an explict order_by
to the relation, and this has taken care of it.  But in this case,
I've added order_by in each relationship, but the SQL is still being
constructed with an attempt to order by rowid.

There is a "however" to this whole thing though, and it's a strange
one.  If I build an Endorsement object explicitly, assigning all the
relevant primary keys and then running a session.import_instance
against the object, I get the above ORA error.  However, if I just
allow the Policy object to lazyload the endorsement objects, it
retrieves them without any difficulty.

Because the relationships seem to work in lazyload, and becaue I've
already added all the "order_by" statements I can think to add, I'm
not sure where to go next, or how to narrow the whole of it down to a
test case.  Any help, though, would be greatly appreciated.  Thanks!

The above references the following set of tables and relationships:

policies = Table('pol_homepolicy_tbl', meta,
    Column('pol_policy_num', String(10), primary_key=True, key='policyNum'),
    Column('pol_policy_eff_date', DateTime, primary_key=True,
key='effectiveDate'),
    # truncated
    ...
)

endorsements = Table('end_endorsement_tbl', meta,
    Column('end_policy_num', String(10),
ForeignKey('pol_homepolicy_tbl.policyNum'), primary_key=True,
key='policyNum'),
    Column('end_endorsement_type', String(20),
ForeignKey('uhe_endorsement_tbl.type'), primary_key=True, key='type'),
    Column('end_endorsement_id', Integer, primary_key=True, key='id'),
    Column('end_policy_eff_date', DateTime,
ForeignKey('pol_homepolicy_tbl.effectiveDate'), primary_key=True,
key='policyEffDate'),
    Column('end_endorsement_edition_date', String(7),
ForeignKey('uhe_endorsement_tbl.editionDate'), key='editionDate'),
    # truncated
    ...
)

endorsementDefinitions = Table('uhe_endorsement_tbl', meta,
    Column('end_endorsement_type', String(10), primary_key=True, key='type'),
    Column('uhe_effect_date', DateTime, primary_key=True, key='effectiveDate'),
    Column('end_endorsement_desc', String(100), key='description'),
    Column('end_endorsement_form_id', String(12), key='formNumber'),
    Column('r_end_ed_date', String(7), key='editionDate')
)

EndorsementDefinition.mapper = mapper(EndorsementDefinition,
endorsementDefinitions)

EndorsementLineItem.mapper = mapper(EndorsementLineItem, endorsements)

distinct_ends_select = select(
            [
            endorsements.c.policyNum,
            endorsements.c.policyEffDate,
            endorsements.c.type,
            endorsements.c.editionDate
            ],
            order_by=[asc(endorsements.c.type)],
            distinct=True,
            ).alias('distinct_ends_select')

Endorsement.mapper = mapper(Endorsement, distinct_ends_select,
is_primary=True, properties=dict(
    definition = relation(EndorsementDefinition, lazy=False,
private=False, order_by=asc(endorsementDefinitions.c.type),
                          primaryjoin=and_(

distinct_ends_select.c.end_endorsement_type==endorsementDefinitions.c.type,

distinct_ends_select.c.end_endorsement_edition_date==endorsementDefinitions.c.editionDate,
                            ),
                    ),
    lineItems = relation(EndorsementLineItem, lazy=False,
private=True, order_by=asc(endorsements.c.type),
        foreignkey=(
            endorsements.c.policyNum,
            endorsements.c.policyEffDate,
            endorsements.c.type,
            ),
        primaryjoin=and_(
            distinct_ends_select.c.end_policy_num==endorsements.c.policyNum,
            
distinct_ends_select.c.end_policy_eff_date==endorsements.c.policyEffDate,
            distinct_ends_select.c.end_endorsement_type==endorsements.c.type
        )
    )
))

Policy.mapper = mapper(Policy, policies, extension=PolicyExtension(),
properties=dict(
    endorsements = relation(Endorsement, lazy=True, private=True,
order_by=asc(distinct_ends_select.c.end_endorsement_type)),
    # truncated
    ...
))

-- 
"All guilt is relative, loyalty counts, and never let your conscience
be your guide."
  - Lucas Buck, American Gothic

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to