Hi,
It seems that the contenttype framework and the sites contribs
conflict with using the autocommit:True database option.  I'm not
really sure what happens but here is a simple test case that shows
that the order of the tests causes a failure.  It looks like from the
SQL that the save point is being rolled back in a new transaction, not
the transaction that the savepoint was created.

If I create a new django tests site
with
{{{
django-admin-2.6.py startproject sitecontenttypebug
}}}

Modify settings.py to use postgres autocommit

{{{
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        ...
        'OPTIONS': {
            "autocommit": True,
        }
    }
}
}}}

The minimum required to have the django tests fail is:
{{{
python manage.py test contenttypes
sites.SitesFrameworkTests.test_get_current_site
}}}

Switching the order causes no failure
{{{
python manage.py test sites.SitesFrameworkTests.test_get_current_site
contenttypes
}}}

Stack trace from the failure
{{{
======================================================================
ERROR: test_get_current_site
(django.contrib.sites.tests.SitesFrameworkTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/test/testcases.py", line 257, in
__call__
    self._pre_setup()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/test/testcases.py", line 224, in
_pre_setup
    self._fixture_setup()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/test/testcases.py", line 515, in
_fixture_setup
    return super(TestCase, self)._fixture_setup()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/test/testcases.py", line 236, in
_fixture_setup
    call_command('flush', verbosity=0, interactive=False, database=db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/core/management/__init__.py", line
166, in call_command
    return klass.execute(*args, **defaults)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/core/management/base.py", line 220,
in execute
    output = self.handle(*args, **options)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/core/management/base.py", line 351,
in handle
    return self.handle_noargs(**options)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/core/management/commands/flush.py",
line 75, in handle_noargs
    emit_post_sync_signal(all_models, verbosity, interactive, db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/core/management/sql.py", line 182,
in emit_post_sync_signal
    interactive=interactive, db=db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 172,
in send
    response = receiver(signal=self, sender=sender, **named)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/contrib/auth/management/
__init__.py", line 28, in create_permissions
    defaults={'name': name, 'content_type': ctype})
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/db/models/manager.py", line 135, in
get_or_create
    return self.get_query_set().get_or_create(**kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/db/models/query.py", line 387, in
get_or_create
    transaction.savepoint_rollback(sid, using=self.db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/db/transaction.py", line 242, in
savepoint_rollback
    connection._savepoint_rollback(sid)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/db/backends/__init__.py", line 61,
in _savepoint_rollback
    self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/
base.py", line 44, in execute
    return self.cursor.execute(query, args)
DatabaseError: no such savepoint


----------------------------------------------------------------------
Ran 2 tests in 0.478s

FAILED (errors=1)
Destroying test database 'default'...
}}}

Offending SQL
{{{
LOG:  statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG:  statement: SELECT "auth_permission"."id",
"auth_permission"."name", "auth_permission"."content_type_id",
"auth_permission"."codename" FROM "auth_permission" WHERE
("auth_permission"."codename" = E'add_user'  AND
"auth_permission"."content_type_id" = 3 )
LOG:  statement: SAVEPOINT s140735080041632_x1
LOG:  statement: INSERT INTO "auth_permission" ("name",
"content_type_id", "codename") VALUES (E'Can add user', 3,
E'add_user') RETURNING "auth_permission"."id"
LOG:  statement: COMMIT
ERROR:  insert or update on table "auth_permission" violates foreign
key constraint "content_type_id_refs_id_728de91f"
DETAIL:  Key (content_type_id)=(3) is not present in table
"django_content_type".
STATEMENT:  COMMIT
LOG:  statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG:  statement: ROLLBACK TO SAVEPOINT s140735080041632_x1
ERROR:  no such savepoint
STATEMENT:  ROLLBACK TO SAVEPOINT s140735080041632_x1
LOG:  statement: SHOW default_transaction_isolation
LOG:  statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG:  statement: SET TIME ZONE E'America/Chicago'
LOG:  statement: ROLLBACK
LOG:  statement: DROP DATABASE "test_jason_db"

}}}

Jason

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

Reply via email to