Hello guys. I try to make my own GenericFunction with default compiler and custom compiler for particular dialect. As you see below, always used custom compiler:
from sqlalchemy import func, create_engine, Integer from sqlalchemy.ext.compiler import compiles from sqlalchemy.orm import sessionmaker from sqlalchemy.sql.functions import GenericFunction engine_ch = create_engine('clickhouse+native://log:pas@127.0.0.1:9000/db') engine_pg = create_engine('postgresql://log:pas@127.0.0.1:9000/db') ses_pg = sessionmaker(bind=engine_pg)() ses_ch = sessionmaker(bind=engine_ch)() class IntDiv(GenericFunction): type = Integer package = 'custom' name = 'div' identifier = 'div' @compiles(IntDiv) def visit_div_default(element, compiler, **kwargs): return 'div(%s)' % compiler.process(element.clause_expr.element) @compiles(IntDiv, 'clickhouse') def visit_div_ch(element, compiler, **kwargs): return 'intDiv(%s)' % compiler.process(element.clause_expr.element) print(ses_ch.bind.dialect.name) print(ses_ch.query(func.custom.div(1, 2))) print(ses_pg.bind.dialect.name) print(ses_pg.query(func.custom.div(1, 2))) If I not make "@compiles(IntDiv)" (for default dialct), make only @compiles(IntDiv, 'clickhouse) I got this error: Traceback (most recent call last): File "/home/anton/Projects/proj/core/run/stuff.py", line 31, in <module> print(ses_ch.query(func.custom.div(1, 2))) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 3457, in __str__ return str(self._compile_context().statement) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 506, in __str__ return unicode(self.compile()).encode('ascii', 'backslashreplace') File "<string>", line 1, in <lambda> File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 494, in compile return self._compiler(dialect, bind=bind, **kw) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 500, in _compiler return dialect.statement_compiler(dialect, self, **kw) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 395, in __init__ Compiled.__init__(self, dialect, statement, **kwargs) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 190, in __init__ self.string = self.process(self.statement, **compile_kwargs) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 213, in process return obj._compiler_dispatch(self, **kwargs) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch return meth(self, **kw) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1584, in visit_select for name, column in select._columns_plus_names File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1357, in _label_select_column **column_clause_args File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 93, in _compiler_dispatch return meth(self, **kw) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 615, in visit_label OPERATORS[operators.as_] + \ File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/ext/compiler.py", line 423, in <lambda> lambda *arg, **kw: existing(*arg, **kw)) File "/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/ext/compiler.py", line 460, in __call__ "compilation handler." % type(element)) sqlalchemy.exc.CompileError: <class '__main__.IntDiv'> construct has no default compilation handler. Is it possible to override default GenericFunction compiler? -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.