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:[email protected]:9000/db')
engine_pg = create_engine('postgresql://log:[email protected]: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 [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.