Hi Michael,

checking for "proxies" did not work for aliases when using a "Query"
object:

q = Query(mappedclass_alias).filter(mappedclass_alias.id ==
2).limit(1)
print q.statement

SELECT table_1.id, table_1.text, table_1.geom
FROM "table" AS table_1
WHERE table_1.id = :id_1
 LIMIT 1


But your 2nd suggestion works fine, my compiles method now looks like
this:

@compiles(GeometryExtensionColumn)
def compile_column(element, compiler, **kw):
    if isinstance(element.table, (Table, Alias)):
        if kw.has_key("within_columns_clause") and
kw["within_columns_clause"] == True:
            return compiler.process(functions.wkb(element))

    return compiler.visit_column(element)


Thanks a lot, you are doing an awesome job!

Tobias


On May 11, 5:21 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> now you're on the big stage where your column is properly recognzied, so you 
> have to write the compiles method correctly:
>
> @compiles(GeometryExtensionColumn)
> def compile_column(element, compiler, **kw):
>     if not getattr(element, 'proxies', None):
>         if kw.has_key("within_columns_clause") and  
> kw["within_columns_clause"] == True:
>             return "AsBinary(%s)" % element
>
>     return compiler.visit_column(element)
>
> I cannot say for sure if checking for "proxies" is always the correct way to 
> tell if you're derived or not.  Another way is to check the parent "table" of 
> the column and seeing if it is an instance of Table or Select.
>
> On May 11, 2010, at 10:49 AM, Tobias wrote:
>
> > Ok, I made a basic example. Thanks for taking a look at it!
>
> > from sqlalchemy import MetaData, Table, Column, create_engine
> > from sqlalchemy.types import Integer, Unicode
> > from sqlalchemy.orm import mapper
> > from sqlalchemy.orm.query import Query
> > from sqlalchemy.sql import func, and_
> > from sqlalchemy.ext.declarative import declarative_base
> > from sqlalchemy.ext.compiler import compiles
> > from sqlalchemy.sql import select
>
> > engine = create_engine('oracle://dummy:du...@dummy:1521/dummy',
> > echo=True)
> > Base = declarative_base(metadata=MetaData())
>
> > class GeometryExtensionColumn(Column):
> >    pass
>
> > @compiles(GeometryExtensionColumn)
> > def compile_column(element, compiler, **kw):
> >    if kw.has_key("within_columns_clause") and
> > kw["within_columns_clause"] == True:
> >        return "AsBinary(%s)" % element
>
> >    return element.__str__()
>
> > class MappedClass(Base):
> >    __tablename__ = "table"
> >    id = Column(Integer, primary_key=True)
> >    text = Column(Unicode)
> >    geom = GeometryExtensionColumn(Unicode)
>
> > print select([MappedClass.__table__]).where(MappedClass.id ==
> > 1).limit(1).compile(engine)
>
> > # Output for release 0.6.0
> > #
> > #SELECT id, text, geom
> > #FROM (SELECT "table".id AS id, "table".text AS text,
> > AsBinary(table.geom) AS geom
> > #FROM "table"
> > #WHERE "table".id = :id_1)
> > #WHERE ROWNUM <= :ROWNUM_1
>
> > # Output for current tip (b03613c840a4)
> > #
> > #SELECT id, text, AsBinary(geom)
> > #FROM (SELECT "table".id AS id, "table".text AS text,
> > AsBinary(table.geom) AS geom
> > #FROM "table"
> > #WHERE "table".id = :id_1)
> > #WHERE ROWNUM <= :ROWNUM_1
>
> > On May 11, 2:41 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >> I would need fully working code to test.  just one python file with the 
> >> minimal reproducing situation.
>
> >> On May 11, 2010, at 2:41 AM, Tobias wrote:
>
> >>> Hi Michael,
>
> >>> thanks for your reply. The current tip seems to fix that problem
> >>> without having to override '_make_proxy()'. But there is another
> >>> problem I have with the current tip even without aliases.
>
> >>> The following query worked fine in release 0.6.0, but in the current
> >>> tip the outer queries are not compiled correctly:
>
> >>> s1 = session.query(Spot).filter(Spot.spot_id == 1).first()
>
> >>> Query sent in release 0.6.0:
>
> >>> 2010-05-11 08:25:01,938 INFO sqlalchemy.engine.base.Engine.0x...112c
> >>> SELECT spots_spot_location, spots_spot_id, spots_spot_height
> >>> FROM (SELECT spots_spot_location, spots_spot_id, spots_spot_height,
> >>> ROWNUM AS ora_rn
> >>> FROM (SELECT SDO_UTIL.TO_WKBGEOMETRY(spots.spot_location) AS
> >>> spots_spot_location, spots.spot_id AS spots_spot_id, spots.spot_height
> >>> AS spots_spot_height
> >>> FROM spots
> >>> WHERE spots.spot_id = :spot_id_1)
> >>> WHERE ROWNUM <= :ROWNUM_1)
> >>> WHERE ora_rn > :ora_rn_1
> >>> 2010-05-11 08:25:01,939 INFO sqlalchemy.engine.base.Engine.0x...112c
> >>> {'ROWNUM_1': 1, 'spot_id_1': 1, 'ora_rn_1': 0}
>
> >>> Query sent in current tip:
>
> >>> 2010-05-11 08:28:33,856 INFO sqlalchemy.engine.base.Engine.0x...838c
> >>> SELECT SDO_UTIL.TO_WKBGEOMETRY(spots_spot_location), spots_spot_id,
> >>> spots_spot_height
> >>> FROM (SELECT SDO_UTIL.TO_WKBGEOMETRY(spots_spot_location),
> >>> spots_spot_id, spots_spot_height, ROWNUM AS ora_rn
> >>> FROM (SELECT SDO_UTIL.TO_WKBGEOMETRY(spots.spot_location) AS
> >>> spots_spot_location, spots.spot_id AS spots_spot_id, spots.spot_height
> >>> AS spots_spot_height
> >>> FROM spots
> >>> WHERE spots.spot_id = :spot_id_1)
> >>> WHERE ROWNUM <= :ROWNUM_1)
> >>> WHERE ora_rn > :ora_rn_1
> >>> 2010-05-11 08:28:33,857 INFO sqlalchemy.engine.base.Engine.0x...838c
> >>> {'ROWNUM_1': 1, 'spot_id_1': 1, 'ora_rn_1': 0}
>
> >>> Only the innermost query should contain "SELECT
> >>> SDO_UTIL.TO_WKBGEOMETRY(..)".
>
> >>> Tobias
>
> >>> On May 10, 5:40 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >>>> creating an alias() or otherwise using the .c. collection of any 
> >>>> selectable that's derived from another selectable (as when you say 
> >>>> select([sometable]).c.somecolumn) means that the Column objects are 
> >>>> actually copies of the original column objects.  This copying procedure 
> >>>> is performed by column._make_proxy().      in rb03613c840a4 I have 
> >>>> modified this so that it uses the effective class of the object, 
> >>>> typically self.__class__, when it constructs the new Column object.   
> >>>> However in 0.6 it is harcdoded to "ColumnClause" and/or "Column".   So 
> >>>> for the current release,  you'd have to ensure your 
> >>>> GeometryExtensionColumn is overriding _make_proxy() as well.  I would 
> >>>> use the _make_proxy() of Column to get its result, then change the class 
> >>>> of the returned Column to GeometryExtensionColumn on the way out.    you 
> >>>> might want to first check that the problem goes away when using the 
> >>>> current tip.
>
> >>>> On May 10, 2010, at 6:07 AM, Tobias wrote:
>
> >>>>> Hi,
>
> >>>>> I am currently working on adding support for Oracle to GeoAlchemy and
> >>>>> Oracle has some methods [1] that (somehow) are only recognized when a
> >>>>> table alias is used. The function "aliased" [2] seemed to work
> >>>>> perfectly, but then I realized that the compiler extension for my
> >>>>> custom column is not executed anymore.
>
> >>>>> The compiler extension looks like this [3]:
>
> >>>>> [..]
> >>>>> class GeometryExtensionColumn(Column):
> >>>>>    pass
>
> >>>>> @compiles(GeometryExtensionColumn)
> >>>>> def compile_column(element, compiler, **kw):
> >>>>>    if kw.has_key("within_columns_clause") and
> >>>>> kw["within_columns_clause"] == True:
> >>>>>        return compiler.process(functions.wkb(element))
>
> >>>>>    return element.__str__()
> >>>>> [..]
>
> >>>>> And if I make a query using the original mapped class, it works as
> >>>>> expected:
>
> >>>>> s = session.query(Spot).get(1)
>
> >>>>> 2010-05-10 11:49:19,957 INFO sqlalchemy.engine.base.Engine.0x...408c
> >>>>> SELECT SDO_UTIL.TO_WKBGEOMETRY(spots.spot_location) AS
> >>>>> spots_spot_location, spots.spot_id AS spots_spot_id, spots.spot_height
> >>>>> AS spots_spot_height
> >>>>> FROM spots
> >>>>> WHERE spots.spot_id = :param_1
> >>>>> 2010-05-10 11:49:19,958 INFO sqlalchemy.engine.base.Engine.0x...408c
> >>>>> {'param_1': 1}
>
> >>>>> But when I create an alias and use this alias in a query,
> >>>>> "compile_column" is not called anymore and in this case
> >>>>> "SDO_UTIL.TO_WKBGEOMETRY" is not added to the query:
>
> >>>>> spot_alias = aliased(Spot)
> >>>>> s_alias = session.query(spot_alias).filter(spot_alias.spot_id ==
> >>>>> 1).first()
>
> >>>>> 2010-05-10 11:49:36,481 INFO sqlalchemy.engine.base.Engine.0x...408c
> >>>>> SELECT spots_1_spot_location, spots_1_spot_id, spots_1_spot_height
> >>>>> FROM (SELECT spots_1_spot_location, spots_1_spot_id,
> >>>>> spots_1_spot_height, ROWNUM AS ora_rn
> >>>>> FROM (SELECT spots_1.spot_location AS spots_1_spot_location,
> >>>>> spots_1.spot_id AS spots_1_spot_id, spots_1.spot_height AS
> >>>>> spots_1_spot_height
> >>>>> FROM spots spots_1
> >>>>> WHERE spots_1.spot_id = :spot_id_1)
> >>>>> WHERE ROWNUM <= :ROWNUM_1)
> >>>>> WHERE ora_rn > :ora_rn_1
>
> >>>>> What is going wrong?
>
> >>>>> Thanks,
> >>>>> Tobias
>
> >>>>> [1]:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11830/sdo_ob...
> >>>>> [2]:http://www.sqlalchemy.org/docs/ormtutorial.html#using-aliases
> >>>>> [3]:http://bitbucket.org/geoalchemy/geoalchemy/src/c0bfcd46cb3a/geoalchem...
>
> >>>>> --
> >>>>> You received this message because you are subscribed to the Google 
> >>>>> Groups "sqlalchemy" group.
> >>>>> To post to this group, send email to sqlalch...@googlegroups.com.
> >>>>> To unsubscribe from this group, send email to 
> >>>>> sqlalchemy+unsubscr...@googlegroups.com.
> >>>>> For more options, visit this group 
> >>>>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> >>>> --
> >>>> You received this message because you are subscribed to the Google 
> >>>> Groups "sqlalchemy" group.
> >>>> To post to this group, send email to sqlalch...@googlegroups.com.
> >>>> To unsubscribe from this group, send email to 
> >>>> sqlalchemy+unsubscr...@googlegroups.com.
> >>>> For more options, visit this group 
> >>>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> >>> --
> >>> You received this message because you are subscribed to the Google Groups 
> >>> "sqlalchemy" group.
> >>> To post to this group, send email to sqlalch...@googlegroups.com.
> >>> To unsubscribe from this group, send email to 
> >>> sqlalchemy+unsubscr...@googlegroups.com.
> >>> For more options, visit this group 
> >>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> >> --
> >> You received this message because you are subscribed to the Google Groups 
> >> "sqlalchemy" group.
> >> To post to this group, send email to sqlalch...@googlegroups.com.
> >> To unsubscribe from this group, send email to 
> >> sqlalchemy+unsubscr...@googlegroups.com.
> >> For more options, visit this group 
> >> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalch...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> ...
>
> read more »

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to