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:

#!/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 at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to