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?