Yes, it works. Thank you. пн, 23 окт. 2017 г. в 17:43, Mike Bayer <mike...@zzzcomputing.com>:
> On Mon, Oct 23, 2017 at 6:40 AM, Антонио Антуан <a.ch....@gmail.com> > wrote: > > 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) > > > Based on that line number, I can see you are on a 1.0.x version of > SQLAlchemy. Query.__str__() takes into account the bound dialect > automatically as of 1.1: > > > http://docs.sqlalchemy.org/en/latest/changelog/migration_11.html#stringify-of-query-will-consult-the-session-for-the-correct-dialect > > if you are on 1.0.x or earlier you need to compile from the statement: > > query.statement.compile(my_engine) > > > > > > > > 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. > > -- > 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. > -- Антон -- 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.