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.

Reply via email to