Thanks much, this did it!

So in terms of a calling application having to support both 0.6 and
0.7, would the best way to support this be something like:

from sqlalchemy import __version__

if __version__ >= 0.7:
    @event.listens_for(engine, "connect")
    def connect(dbapi_connection, connection_rec)
    dbapi_connection.create_function("foo", 1, foo)
else:
    # previous behaviour


On Mar 23, 4:26 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> did some googling around and what I think is involved in that weird exception 
> is that there's a recursion overflow.  Looked at the code, this would be 
> because you're calling upon raw_connection() within the connect() event, 
> hence endless recursion.  The "dbapi_connection" argument passed to def 
> connect() is the actual DBAPI connection you operate upon:
>
> @event.listens_for(engine, "connect")
> def connect(dbapi_connection, connection_rec)
>     dbapi_connection.create_function("foo", 1, foo)
>
> On Mar 23, 2012, at 4:08 PM, Tom Kralidis wrote:
>
>
>
>
>
>
>
>
>
> > Thanks for the info.  When I try this again I get the following error:
>
> > code:
> > from sqlalchemy import create_engine, __version__, event
> > from sqlalchemy.ext.declarative import declarative_base
> > from sqlalchemy.orm import create_session
>
> > def foo(s):
> >    return s
>
> > print __version__
> > engine = create_engine('sqlite:///foo.db', echo=False)
> > base = declarative_base(bind=engine)
> > dataset = type('dataset', (base,),
> > dict(__tablename__='records',__table_args__={'autoload': True}))
> > session = create_session(engine)
>
> > @event.listens_for(engine, "connect")
> > def connect(dbapi_connection, connection_rec):
> >    dbapi_connection = engine.raw_connection()
> >    dbapi_connection.create_function('foo', 1, foo)
>
> > query =
> > session.query(dataset).filter('foo("TESTVALUE")="TESTVALUE"').all()
>
> > error:
> > <snip/>
>
> >  File "./test.py", line 18, in connect
> >    dbapi_connection = engine.raw_connection()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 2544, in
> > raw_connection
> >    return self.pool.unique_connection()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 183, in
> > unique_connection
> >    return _ConnectionFairy(self).checkout()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 387, in __init__
> >    rec = self._connection_record = pool._do_get()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 800, in _do_get
> >    return self._create_connection()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 188, in
> > _create_connection
> >    return _ConnectionRecord(self)
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 270, in __init__
> >    self.connection = self.__connect()
> >  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> > py2.6-linux-i686.egg/sqlalchemy/pool.py", line 334, in __connect
> >    self.__pool.logger.debug("Error on connect(): %s", e)
> >  File "/usr/lib/python2.6/logging/__init__.py", line 1043, in debug
> >    if self.isEnabledFor(DEBUG):
> >  File "/usr/lib/python2.6/logging/__init__.py", line 1250, in
> > isEnabledFor
> >    return level >= self.getEffectiveLevel()
> >  File "/usr/lib/python2.6/logging/__init__.py", line 1238, in
> > getEffectiveLevel
> >    while logger:
> > AttributeError: Logger instance has no attribute '__nonzero__'
>
> > Any idea on what's wrong with the code?
>
> > Thanks
>
> > ..Tom
>
> > On Mar 22, 11:28 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >> On Mar 22, 2012, at 2:33 PM, Tom Kralidis wrote:
>
> >>> We have a webapp that makes use of sqlite3 create_function type
> >>> queries.  Using 0.6, this has worked well for us.
>
> >>> Using 0.7 our approach breaks.  I've tried to distill a minimal test
> >>> case to demonstrate the issue:
>
> >> A NullPool is used in 0.7 for SQLite whereas in 0.6 it was the 
> >> SingletonThreadPool.  Each usage of the engine will procure an entirely 
> >> new SQLite connection with NullPool so any state that was set on a 
> >> previous call to connect() or raw_connection() is gone.
>
> >> To ensure all connections have state established, use an event.   The 
> >> recent post on this list about a week ago 
> >> athttps://groups.google.com/forum/?fromgroups#!searchin/sqlalchemy/sqli...an
> >>  example of this, for the same scenario.
>
> >>> #!/usr/bin/python
>
> >>> from sqlalchemy import create_engine, __version__
> >>> from sqlalchemy.ext.declarative import declarative_base
> >>> from sqlalchemy.orm import create_session
>
> >>> def foo(s):
> >>>    return s
>
> >>> print __version__
> >>> engine = create_engine('sqlite:///foo.db', echo=False)
> >>> base = declarative_base(bind=engine)
> >>> dataset = type('dataset', (base,),
> >>> dict(__tablename__='records',__table_args__={'autoload': True}))
> >>> dbtype = engine.name
> >>> session = create_session(engine)
>
> >>> connection = engine.raw_connection()
> >>> connection.create_function('foo', 1, foo)
>
> >>> query =
> >>> session.query(dataset).filter('foo("TESTVALUE")="TESTVALUE"').all()
>
> >>> Using 0.6, this works.  Using 0.7, we get an OperationalError: no such
> >>> function as per below:
>
> >>> 0.7.6
> >>> Traceback (most recent call last):
> >>>  File "./test.py", line 20, in <module>
> >>>    query =
> >>> session.query(dataset).filter('foo("TESTVALUE")="TESTVALUE"').all()
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/orm/query.py", line 2066, in all
> >>>    return list(self)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/orm/query.py", line 2176, in __iter__
> >>>    return self._execute_and_instances(context)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/orm/query.py", line 2191, in
> >>> _execute_and_instances
> >>>    result = conn.execute(querycontext.statement, self._params)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1450, in execute
> >>>    params)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1583, in
> >>> _execute_clauseelement
> >>>    compiled_sql, distilled_params
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1697, in
> >>> _execute_context
> >>>    context)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1690, in
> >>> _execute_context
> >>>    context)
> >>>  File "/home/tkralidi/lib/python2.6/site-packages/SQLAlchemy-0.7.6-
> >>> py2.6-linux-i686.egg/sqlalchemy/engine/default.py", line 335, in
> >>> do_execute
> >>>    cursor.execute(statement, parameters)
> >>> sqlalchemy.exc.OperationalError: (OperationalError) no such function:
> >>> foo u'SELECT records.id AS records_id, records.title AS records_title
> >>> \nFROM records \nWHERE foo("TESTVALUE")="TESTVALUE"' ()
>
> >>> For reference, the table structure is as follows:
> >>> $ sqlite3 foo.db
> >>> SQLite version 3.7.3
> >>> Enter ".help" for instructions
> >>> Enter SQL statements terminated with a ";"
> >>> sqlite> .dump
> >>> PRAGMA foreign_keys=OFF;
> >>> BEGIN TRANSACTION;
> >>> CREATE TABLE records(id int primary key, title text);
> >>> INSERT INTO "records" VALUES(1,'foo');
> >>> INSERT INTO "records" VALUES(2,'bar');
> >>> COMMIT;
> >>> sqlite>
>
> >>> Any idea on how to support this approach in both 0.6 and 0.7?  Thanks
> >>> for any advice.
>
> >>> ..Tom
>
> >>> --
> >>> You received this message because you are subscribed to the Google Groups 
> >>> "sqlalchemy" group.
> >>> To post to this group, send email to sqlalchemy@googlegroups.com.
> >>> To unsubscribe from this group, send email to 
> >>> sqlalchemy+unsubscr...@googlegroups.com.
> >>> For more options, visit this group 
> >>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalchemy@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to