for example, heres a beast of a unit test:

python test/orm/inheritance/query.py --log-debug=sqlalchemy.engine -- 
db oracle PolymorphicUnionsTest.test_primary_eager_aliasing

When you run on SQLite, one of the queries is:

SELECT anon_1.people_person_id AS anon_1_people_person_id,  
anon_1.people_company_id AS anon_1_people_company_id,  
anon_1.people_name AS anon_1_people_name, anon_1.people_type AS  
anon_1_people_type, anon_1.engineers_person_id AS  
anon_1_engineers_person_id, anon_1.engineers_status AS  
anon_1_engineers_status, anon_1.engineers_engineer_name AS  
anon_1_engineers_engineer_name, anon_1.engineers_primary_language AS  
anon_1_engineers_primary_language, anon_1.managers_person_id AS  
anon_1_managers_person_id, anon_1.managers_status AS  
anon_1_managers_status, anon_1.managers_manager_name AS  
anon_1_managers_manager_name, anon_1.boss_boss_id AS  
anon_1_boss_boss_id, anon_1.boss_golf_swing AS anon_1_boss_golf_swing,  
machines_1.machine_id AS machines_1_machine_id, machines_1.name AS  
machines_1_name, machines_1.engineer_id AS machines_1_engineer_id
FROM (SELECT people.person_id AS people_person_id, people.company_id  
AS people_company_id, people.name AS people_name, people.type AS  
people_type, engineers.person_id AS engineers_person_id,  
engineers.status AS engineers_status, engineers.engineer_name AS  
engineers_engineer_name, engineers.primary_language AS  
engineers_primary_language, managers.person_id AS managers_person_id,  
managers.status AS managers_status, managers.manager_name AS  
managers_manager_name, boss.boss_id AS boss_boss_id, boss.golf_swing  
AS boss_golf_swing
FROM people LEFT OUTER JOIN engineers ON people.person_id =  
engineers.person_id LEFT OUTER JOIN managers ON people.person_id =  
managers.person_id LEFT OUTER JOIN boss ON managers.person_id =  
boss.boss_id ORDER BY people.person_id
  LIMIT 2 OFFSET 1) AS anon_1 LEFT OUTER JOIN machines AS machines_1  
ON anon_1.engineers_person_id = machines_1.engineer_id ORDER BY  
anon_1.people_person_id, machines_1.oid

of note is the anonymous label "anon_1_engineers_primary_language", 34  
characters.   This label is generated from an anonymous alias name  
combined with a column name, which is itself a combination of the  
original table name and column name.  So theres three stages of name  
generation represented here.

Here it is on oracle, including the result rows:

SELECT anon_1.people_person_id AS anon_1_people_person_id,  
anon_1.people_company_id AS anon_1_people_company_id,  
anon_1.people_name AS anon_1_people_name, anon_1.people_type AS  
anon_1_people_type, anon_1.managers_person_id AS  
anon_1_managers_person_id, anon_1.managers_status AS  
anon_1_managers_status, anon_1.managers_manager_name AS  
anon_1_managers_manager_name, anon_1.boss_boss_id AS  
anon_1_boss_boss_id, anon_1.boss_golf_swing AS anon_1_boss_golf_swing,  
anon_1.engineers_person_id AS anon_1_engineers_person_id,  
anon_1.engineers_status AS anon_1_engineers_status,  
anon_1.engineers_engineer_name AS anon_1_engineers_engineer_name,  
anon_1.engineers_primary_language AS anon_1_engineers_primary_1,  
machines_1.machine_id AS machines_1_machine_id, machines_1.name AS  
machines_1_name, machines_1.engineer_id AS machines_1_engineer_id
FROM (SELECT people_person_id, people_company_id, people_name,  
people_type, managers_person_id, managers_status,  
managers_manager_name, boss_boss_id, boss_golf_swing,  
engineers_person_id, engineers_status, engineers_engineer_name,  
engineers_primary_language
FROM (SELECT people.person_id AS people_person_id, people.company_id  
AS people_company_id, people.name AS people_name, people.type AS  
people_type, managers.person_id AS managers_person_id, managers.status  
AS managers_status, managers.manager_name AS managers_manager_name,  
boss.boss_id AS boss_boss_id, boss.golf_swing AS boss_golf_swing,  
engineers.person_id AS engineers_person_id, engineers.status AS  
engineers_status, engineers.engineer_name AS engineers_engineer_name,  
engineers.primary_language AS engineers_primary_language, ROW_NUMBER()  
OVER (ORDER BY people.person_id) AS ora_rn
FROM people LEFT OUTER JOIN managers ON people.person_id =  
managers.person_id LEFT OUTER JOIN boss ON managers.person_id =  
boss.boss_id LEFT OUTER JOIN engineers ON people.person_id =  
engineers.person_id)
WHERE ora_rn>1 AND ora_rn<=3) anon_1 LEFT OUTER JOIN machines  
machines_1 ON anon_1.engineers_person_id = machines_1.engineer_id  
ORDER BY anon_1.people_person_id, machines_1.machine_id
INFO:sqlalchemy.engine.base.Engine.0x..4c:{}
DEBUG:sqlalchemy.engine.base.Engine.0x..4c:Col  
('ANON_1_PEOPLE_PERSON_ID', 'ANON_1_PEOPLE_COMPANY_ID',  
'ANON_1_PEOPLE_NAME', 'ANON_1_PEOPLE_TYPE',  
'ANON_1_MANAGERS_PERSON_ID', 'ANON_1_MANAGERS_STATUS',  
'ANON_1_MANAGERS_MANAGER_NAME', 'ANON_1_BOSS_BOSS_ID',  
'ANON_1_BOSS_GOLF_SWING', 'ANON_1_ENGINEERS_PERSON_ID',  
'ANON_1_ENGINEERS_STATUS', 'ANON_1_ENGINEERS_ENGINEER_NAME',  
'ANON_1_ENGINEERS_PRIMARY_1', 'MACHINES_1_MACHINE_ID',  
'MACHINES_1_NAME', 'MACHINES_1_ENGINEER_ID')
DEBUG:sqlalchemy.engine.base.Engine.0x..4c:Row (2, 1, 'wally',  
'engineer', None, None, None, None, None, 2, 'regular engineer',  
'wally', 'c++', 3, 'Commodore 64', 2)
DEBUG:sqlalchemy.engine.base.Engine.0x..4c:Row (3, 1, 'pointy haired  
boss', 'boss', 3, 'da boss', 'pointy', 3, 'fore', None, None, None,  
None, None, None, None)

Where you can see that "anon_1_engineers_primary_language" becomes  
"anon_1_engineers_primary_1" (27 characters) - this translation occurs  
as late as possible.  It shows up as that name in cursor.description,  
and the ResultProxy translates that truncated name back to a name  
matching the original column object.



On Jun 13, 2008, at 11:12 AM, Michael Bayer wrote:

>
>
> On Jun 13, 2008, at 3:58 AM, Egil Möller wrote:
>
>> I and a coworker are currently working on a patch-set to the oracle
>> driver for SA for this very reason, fixing issues like:
>>
>> * broken mangling of forbidden/to long table/column names
>
> really ?  we have a lot of tests which pass fine for that, including
> when aliases are created, etc.  In compiler.py, all names go through
> the same "length" filter no matter how they got generated (the only
> exception to this is the "too long index names" ticket which is
> strictly a schema thing).   We have a "long labels" test specifically
> for this, and lots of ORM tests generate very long names as well (all
> of which work fine with Oracle).  We did a tremendous amount of
> development on this a few years back and noone has had issues since.
>
> can you post a ticket with an example ?    Also if producing fixes,
> keep in mind theres some compiler differences between 0.4 and 0.5, 0.5
> is the direction we're heading....
>
>>
>> * missing support for the BOOL data type
>
> there may or may not be a ticket for this (please post one if not)
>
>>
>> * missing support for boolean expressions in the column list (
>> select([tbl.c.col1 == tbl.c.col2]) ) (related to the last one above)
>
> ditto
> >


--~--~---------~--~----~------------~-------~--~----~
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