Also, I still can pass a string 'j.goods_id' to query() call this fixes the
first error but then PG query compiler says it can't find a RECORD
definition for the jsonb_ function call that is required according to it's
API. I think that's because of double-quoting of the alias'ed expression in
the FROM-clause generated (it should pass w/o error if not quoted). Is
there any way to suppress quoting for alias() constructs?
вторник, 22 марта 2016 г., 12:37:23 UTC+3 пользователь Andy S написал:
>
> Made this way as I've understood the linked PR:
>
> class ColumnFunction(functions.FunctionElement):
> __visit_name__ = 'function'
>
> @property
> def columns(self):
> return FromClause.columns.fget(self)
>
> def _populate_column_collection(self):
> for col in self.column_defs:
> self._columns[col.name] = FunctionColumn(self, col.name)
>
> def alias(self, name=None, flat=False):
> cols = ['%s %s' % (c.name, c.type.__visit_name__) for c in
> self.column_defs]
>
> return Alias(self, '%s(%s)' % (name, ', '.join(cols)))
>
>
> class jsonb_to_recordset_func(ColumnFunction):
> name = 'jsonb_to_recordset'
> column_defs = [
> Column(Integer, name='goods_id'),
> Column(Integer, name='quantity')
> ]
>
>
>
> then a construct as:
> jr =
> jsonb_to_recordset_func(OrderCsExtra.supplemental_items).alias('j')
>
> q = SQLAS.query(jr.c.goods_id).select_from(jr)
> print(q.statement.compile(dialect=postgresql.dialect(),
> compile_kwargs={'literal_binds': True}))
>
>
> produces
> SELECT "j(goods_id integer, quantity integer)".goods_id AS "j(goods_id
> integer, quantity integer)_goods_id" \nFROM
> jsonb_to_recordset(orders_cs_extra.supplemental_items) AS "j(goods_id
> integer, quantity integer)"
>
> So still can't figure out how to refer an alias as it's outer part of name
> (that part outside the brackets) at QUERY-clause. Still it should pass the
> whole construct to the FROM-clause.
>
>
>
>
> понедельник, 21 марта 2016 г., 13:38:33 UTC+3 пользователь Andy S написал:
>>
>> I'm stuck with the need to generate a query of the form like:
>>
>> SELECT
>> a.id,
>> b.name,
>> jr.*
>> FROM
>> a, b outer join jsonb_populate_recordset(b.jrs) as jr(bid numeric, name
>> varchar) on (TRUE)
>> WHERE
>> a.id = b.a_id
>>
>> First, it's not clear to me how to construct a dynamically defined RECORD
>> as 'jr(bid numeric, name varchar)' so 'jr' becomes a table name that could
>> be referenced later on
>>
>> Then it's not clear to me how to construct a table-like object of a
>> function call that one can reference in query() by it's name ('jr' in this
>> case).
>>
>>
>> Is it possible with SQLAlchemy?
>>
>
--
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.