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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---