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.

Reply via email to