remove queries delete binds python function postgresql sqlalchemy named-parameters

python - queries - Parámetros con nombre en las funciones de la base de datos con SQLAlchemy



sqlalchemy documentation (1)

Gracias a la sugerencia de Michael Bayer , se me ocurrió una solución a mi propia pregunta: el truco es usar el compilador de SQLAlchemy , y algunos de escape adecuados:

from psycopg2.extensions import adapt as sqlescape import sqlalchemy from sqlalchemy import select from sqlalchemy.ext.compiler import compiles from sqlalchemy.sql.expression import ColumnClause class MyFunc(ColumnClause): def __init__(self, *args, **kwargs): self.kwargs = kwargs super().__init__(*args) @compiles(MyFunc) def compile_myfunc(element, compiler, **kw): s = '',''.join("%s:=%s" % (k, sqlescape(v)) for k, v in element.kwargs.items()) return "%s(%s)" % (element.name, s) def call(engine, func, **kwargs): return engine.execute(select([MyFunc(func, **kwargs)])) engine = sqlalchemy.create_engine(''postgresql+psycopg2://lbolla@localhost/mytest'') print(call(engine, ''test_f'', a=''a'').scalar()) print(call(engine, ''test_f'', b=''b'').scalar())

Tengo una función en mi base de datos (Postgres) que se ve así:

create function test_f(a text default ''*'', b text default ''+'') returns text as $$ select a || '' '' || b; $$ language sql;

Postgres permite llamarlo con parámetros nombrados:

mytest=> select test_f(''a'', ''b''); test_f -------- a b (1 row) mytest=> select test_f(''a''); test_f -------- a + (1 row) mytest=> select test_f(b:=''a''); test_f -------- * a (1 row)

Quiero hacer lo mismo desde Python, usando la construcción de func de SQLAlchemy , pero parece que func no func parámetros con nombre:

In [85]: print(sqlalchemy.func.test_f(''a'', ''b'')) test_f(:test_f_1, :test_f_2) In [86]: print(sqlalchemy.func.test_f(''a'')) test_f(:test_f_1) In [87]: print(sqlalchemy.func.test_f(a=''a'')) test_f()

¿Me estoy perdiendo algo, o func no es compatible con los parámetros nombrados?