Hi Gerhard, hi all,
in the last days, we have been trying to run django on pypy, using the
ctypes based implementation of pysqlite.
In doing this, we encountered a problem; we have exchanged a bit of
private mails, so I try to sum up here:
This snippet explodes when run with pysqlite-ctypes, either on cpython
or pypy-c:
>>>> from pysqlite2.dbapi2 import connect
>>>> db = connect(':memory:')
>>>> db.execute('BEGIN IMMEDIATE TRANSACTION')
<pysqlite2.dbapi2.Cursor object at 0xb7dc4f6c>
>>>> db.execute('COMMIT')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/home/exarkun/Scratch/Source/pysqlite3/pysqlite2/dbapi2.py",
line 315, in execute
return cur.execute(*args)
File "/home/exarkun/Scratch/Source/pysqlite3/pysqlite2/dbapi2.py",
line 483, in execute
raise self.connection._get_exception()
pysqlite2.dbapi2.OperationalError: SQL logic error or missing database
The very same thing happens on python 2.4 + pysqlite2 (non-ctypes version):
>>> from pysqlite2.dbapi2 import connect
>>> db = connect(':memory:')
>>> db.execute('BEGIN IMMEDIATE TRANSACTION')
<pysqlite2.dbapi2.Cursor object at 0xb7cb0860>
>>> db.execute('COMMIT')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
pysqlite2.dbapi2.OperationalError: cannot commit - no transaction is active
However, it works perfectly on cpython 2.5 + sqlite3:
>>> from sqlite3.dbapi2 import connect
>>> db = connect(':memory:')
>>> db.execute('BEGIN IMMEDIATE')
<sqlite3.Cursor object at 0xf7cff050>
>>> db.execute('COMMIT')
<sqlite3.Cursor object at 0xf7cff020>
Samuele pointed out that maybe it's just a difference between pysqlite2
and pysqlite3; after more digging, he changed pysqlite-ctypes to print
every SQL statement before sending it to sqlite; what he got is this:
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pysqlite2 import dbapi2
>>> db = dbapi2.connect(':memory:')
>>> db.execute('BEGIN IMMEDIATE TRANSACTION')
BEGIN IMMEDIATE TRANSACTION
<pysqlite2.dbapi2.Cursor object at 0x55e90>
>>> db.execute('COMMIT')
COMMIT
COMMIT
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pysqlite2/dbapi2.py", line 318, in execute
return cur.execute(*args)
File "pysqlite2/dbapi2.py", line 489, in execute
raise self.connection._get_exception()
pysqlite2.dbapi2.OperationalError: SQL logic error or missing database
The double COMMIT is probably causing the problem; not sure if it's a
bug in pysqlite-ctypes or an expected behavior.
Gerhard, what do you think about all of this? What's the best way to solve?
ciao,
Anto
_______________________________________________
[email protected]
http://codespeak.net/mailman/listinfo/pypy-dev