Received a response on the SQLAlchemy forum. Here is a simple project
I put together demonstrating using the @compiles decorator to create a
set-returning expression (thanks to Michael Bayer for providing the
@compiles usage example).
from sqlalchemy import create_engine
from sqlalchemy.schema import MetaData, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
from geoalchemy.geometry import Polygon, GeometryColumn, GeometryDDL
from sqlalchemy.types import Integer
from sqlalchemy.sql.expression import func
## SET-UP PROJECT
==============================================================
connstr = 'sqlite:///:memory:'
engine = create_engine(connstr)
metadata = MetaData(bind=engine)
Base = declarative_base(metadata=metadata)
Session = sessionmaker(bind=engine)
class Data1(Base):
__tablename__ = 'data1'
id = Column(Integer,primary_key=True)
geom = GeometryColumn(Polygon(2))
class Data2(Base):
__tablename__ = 'data2'
id = Column(Integer,primary_key=True)
geom = GeometryColumn(Polygon(2))
GeometryDDL(Data1.__table__)
GeometryDDL(Data2.__table__)
## BUILD NEW EXPRESSION
========================================================
#any SQL you want can be made available with Python expressions using
@compiles:
from sqlalchemy.sql import ColumnElement
from sqlalchemy.ext.compiler import compiles
class set_return(ColumnElement):
def __init__(self,base,field):
self.base = base
self.field = field
self.type = None # throws an error unless declared...
@compiles(set_return)
def compile(expr, compiler, **kw):
return compiler.process(expr.base) + '.' + expr.field
## CONSTRUCT SOME QUERIES
======================================================
s = Session()
q = s.query(Data1.id.label('id_data1'),
Data2.id.label('id_data2'),
set_return(func.ST_Dump(func.ST_Intersection(Data1.geom,Data2.geom)),
'geom').label('geom'))
print q
## or...
base = func.ST_Dump(func.ST_Intersection(Data1.geom,Data2.geom))
field = 'geom'
q = s.query(Data1.id.label('id_data1'),
Data2.id.label('id_data2'),
set_return(base,field).label('geom'))
print q
s.close()
On Aug 16, 2:09 pm, bekozi <
benkoz...@gmail.com> wrote:
> Posted there. Will let you know if I hear anything.
>
>
http://groups.google.com/group/sqlalchemy/browse_thread/thread/cc3b5a...