I'm having trouble working with multi-db using mysql replication.  When
I run our test suite, I'm getting several hundred errors if I have more
than one database configured, and none if I have only one configured.

It seems that something isn't getting properly cleared out between test
cases, so duplicate objects are getting created.

My DATABASES setting looks like this: 


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'jellyroll',
        'NAME': 'ee',
        'USER': 'ee',
        'PASSWORD': 'ee',
        'OPTIONS': {    
            'init_command': 'SET storage_engine=INNODB',
            'charset' : 'utf8',
            'use_unicode' : True,
        },
    },
    'replicant0': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'jellyroll-rep0',
        'NAME': 'test',
        'USER': 'ee',
        'PASSWORD': 'ee',
        'TEST_MIRROR': 'default',
        'OPTIONS': {    
            'init_command': 'SET storage_engine=INNODB',
            'charset' : 'utf8',
            'use_unicode' : True,
        },
    },
}


My router looks like this:

class PrimaryReplicantRouter(object):
    """Set up routing with one primary database, and zero or more 
    replicant databases."""

    db_list = settings.DATABASES.keys()
    primary_db = 'default'
    replicant_db_list = [x for x in db_list if x != primary_db]

    def db_for_read(self, model, **hints):
        try:
            return random.choice(self.replicant_db_list)
        except IndexError:
            return self.primary_db


    def db_for_write(self, model, **hints):
        """Write to the Primary DB"""
        return self.primary_db

    def allow_relation(self, obj1, obj2, **hints):
        """Allow a relationship between any two objects in the db 
        pool"""

        if (obj1._state.db in self.db_list 
            and obj2._state.db in self.db_list):
            return True
        return None

    def allow_syncdb(self, db, models):
        """All writes go to the primary db."""
        return db == self.primary_db

The first error that comes out of the test suite is a duplicate username
in auth during a testcase's setUp, which makes it look like the object
is getting created on one test pass, and then created again the next
time around without deleting it properly:


$ ./manage.py test --failfast
.....E
======================================================================
ERROR: Regressiontest for #12462
----------------------------------------------------------------------
Traceback (most recent call last):
  File
"/home/cliff/projects/lr-mdb/lexilereader/web/../contrib/django/contrib/auth/tests/auth_backends.py",
 line 14, in setUp
    User.objects.create_user('test', 't...@example.com', 'test')
...
IntegrityError: (1062, "Duplicate entry 'test' for key 2")


Any ideas what's going wrong?



-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@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