the literal('c') compiles into a bind parameter, which is not able to  
"export" itself as a column on its enclosing "selectable", so thats  
that error (i might want to look into adding a better error for that  
one, had never seen it before).  you want to use a newer function  
literal_column("c").   the change in 0.3.5 is that saying column 
("something") is going to apply case sensitivity rules to the string  
inside...since yours has '' inside of it, it says, "oh i have to  
quote that".  so literal_column() disables all quoting rules (and its  
whats used inside of the polymorphic_union function now).

On Mar 21, 2007, at 3:37 PM, Toshio Kuratomi wrote:

>
> Hi guys.
>
> I'm using sqlalchemy with TurboGears.  The code for my project is GPL,
> so if you need access to more source just let me know:
>
> I was successfully using the following definition of a
> polymorphic_union in 0.3.4::
>
> '''
> collectionJoin = polymorphic_union (
>         {'b' : select((CollectionTable.join(
>             BranchTable, CollectionTable.c.id ==
> BranchTable.c.collectionid),
>             column("'b'").label('kind'))),
>          'c' : select((CollectionTable, column("'c'").label('kind')),
>              not_(CollectionTable.c.id.in_(select(
>                  (CollectionTable.c.id,),
>                  CollectionTable.c.id == BranchTable.c.collectionid)
>              )))
>          },
>         None
>         )
> '''
>
> In 0.3.5, this gives me errors.  Inspecting the SQL, it looks like I'm
> getting this kind of select now::
>   SELECT collection.id, "\'c\'" AS kind \nFROM collection
>
> which isn't what I want.  I want something more like this::
>   SELECT collection.id, 'c' AS kind \nFROM collection
>
> I browse the docs and find that literal() is what I want.  I try::
> '''
> select((CollectionTable, literal('c').label('kind')),
>              not_(CollectionTable.c.id.in_(select(
>                  (CollectionTable.c.id,),
>                  CollectionTable.c.id == BranchTable.c.collectionid)
>              )))
> '''
>
> which works fine as a bare statement.  Now I plug this into my
> polymorphic union::
> '''
> collectionJoin = polymorphic_union (
>         {'b' : select((CollectionTable.join(
>             BranchTable, CollectionTable.c.id ==
> BranchTable.c.collectionid),
>             literal('b').label('kind'))),
>          'c' : select((CollectionTable, literal('c').label('kind')),
>              not_(CollectionTable.c.id.in_(select(
>                  (CollectionTable.c.id,),
>                  CollectionTable.c.id == BranchTable.c.collectionid)
>              )))
>          },
>         None
>         )
> '''
>
> And now I'm getting a different error::
> '''
> Traceback (most recent call last):
>   File "/var/www/repo/vanilla-fedora-packagedb/pkgdb/start-pkgdb.py",
> line 25, in ?
>     from pkgdb.controllers import Root
>   File "/var/www/repo/vanilla-fedora-packagedb/pkgdb/pkgdb/
> controllers.py", line 7, in ?
>     from pkgdb import model
>   File "/var/www/repo/vanilla-fedora-packagedb/pkgdb/pkgdb/model.py",
> line 222, in ?
>     None
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/util.py", line
> 47, in polymorphic_union
>     for c in table.c:
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 779,
> in <lambda>
>     c = property(lambda s:s._get_exported_attribute('_columns'))
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 776,
> in _get_exported_attribute
>     self._export_columns()
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 801,
> in _export_columns
>     export = self._exportable_columns()
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line
> 1226, in _exportable_columns
>     return self.selectable.columns
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 778,
> in <lambda>
>     columns = property(lambda s:s._get_exported_attribute('_columns'))
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 776,
> in _get_exported_attribute
>     self._export_columns()
>   File "/usr/lib/python2.4/site-packages/sqlalchemy/sql.py", line 815,
> in _export_columns
>     for ci in cp.orig_set:
> AttributeError: '_BindParamClause' object has no attribute 'orig_set'
> '''
>
> Any ideas on how I should construct my polymorphic_union?
>
> Thanks,
> -Toshio
>
>
> >


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