Gmail warns you before posting something with "I've attached" and no
attachment, but apparently Google Groups does not.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.
from sqlalchemy.sql.expression import FromClause, ColumnClause, _anonymous_label, _truncated_label, func
from sqlalchemy.ext.compiler import compiles
__all__ = ['PGSetReturningFunction', 'srfunc', 'compiles_srf']
class PGSetReturningFunction(FromClause):
named_with_column = True
def __init__(self, func, columns, alias=None):
self.func = func
self._column_args = [ ColumnClause(c) if isinstance(c, str) else c for c in columns ]
self.name = alias or func.name
self._from_objects = [self]
def alias(self, name=None):
if name is None:
if self.named_with_column:
name = getattr(self, 'name', None)
name = _anonymous_label('%%(%d %s)s' % (id(self), name or 'anon'))
return self.__class__(self.func, self.c, name)
def column_alias(self, from_, to):
pg = self.__class__(self.func, self.c, self.name)
pg.c
pg._columns[to] = pg._columns[from_]._make_proxy(pg, to)
pg._columns.remove(pg.c[from_])
return pg
def column_map(self, iterable):
pg = self.__class__(self.func, self.c, self.name)
pg.c
_new_columns = dict()
for from_, to in iterable:
_new_columns[to] = pg._columns[from_]._make_proxy(pg, to)
pg._columns.remove(pg.c[from_])
pg._columns.update(_new_columns)
return pg
def _populate_column_collection(self):
for c in self._column_args:
c._make_proxy(self)
class Generator():
def __getattr__(self, key):
def create_function(*args, **kw):
columns = kw['columns']
return PGSetReturningFunction(getattr(func, key)(*args), columns)
return create_function
srfunc = PGSetReturningFunction.Generator()
@compiles(PGSetReturningFunction)
def compile_srf(element, compiler, **kw):
col_kwargs = kw.copy()
col_kwargs['include_table'] = False
alias=element.name
if isinstance(alias, _truncated_label):
alias = compiler._truncated_identifier("alias", alias)
return "{function} AS {alias}({columns})".format(
function=compiler.process(element.func, **kw),
alias=alias,
columns=", ".join(compiler.process(expr, **col_kwargs) for expr in element.c)
)
series = srfunc.generate_series(1, 10, columns=['value']).alias().column_map({'value': 'v'}.items())
print(str(series))