On Nov 13, 2013, at 6:12 PM, Daniel Grace <[email protected]> wrote:
|
from sqlalchemy.sql.selectable import FromClause from sqlalchemy import select, func, Column, Integer from sqlalchemy.ext.compiler import compiles
class PGAsFunc(FromClause):
named_with_column = True
def __init__(self, func, columns, alias=None):
self.func = func
self._column_args = columns
self.name = alias or func.name
self._from_objects = [self]
def alias(self, name):
return PGAsFunc(self.func, self.c, name)
def column_alias(self, from_, to):
pg = PGAsFunc(
self.func,
self.c,
self.name)
# this isn't really a built-in operation so klunk it through
pg.c
pg._columns[to] = pg._columns[from_]._make_proxy(pg, to)
pg._columns.remove(pg.c[from_])
return pg
def _populate_column_collection(self):
for c in self._column_args:
c._make_proxy(self)
class MyFuncThing(object):
def __getattr__(self, key):
def create_function(*args, **kw):
output = kw['output']
return PGAsFunc(getattr(func, key)(*args), output)
return create_function
@compiles(PGAsFunc)
def compile(element, compiler, **kw):
col_kwargs = kw.copy()
col_kwargs['include_table'] = False
return "%s AS %s(%s)" % (
compiler.process(element.func, **kw),
element.name,
", ".join(
compiler.process(expr, **col_kwargs)
for expr in element.c
)
)
series = MyFuncThing().generate_series(1, 10, output=[Column('value', Integer())])
foo = series.alias("foo").column_alias('value', 'v')
bar = foo.alias("bar") # I'm assuming that aliasing an existing alias Does The Right Thing(tm), I've never tried it.
from sqlalchemy.orm import Session
session = Session()
print session.query(series.c.value)
print session.query(foo.c.v)
print session.query(foo.c.v + bar.c.v).select_from(foo).join(bar, foo.c.v < bar.c.v)
|
signature.asc
Description: Message signed with OpenPGP using GPGMail
