On Wed, 2010-05-05 at 08:08 +0800, Russell Keith-Magee wrote: > On Wed, May 5, 2010 at 1:43 AM, J. Cliff Dyer <j...@sdf.lonestar.org> wrote: > > 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? > > I can't say I've seen this problem myself. Some more details might > help narrow down the problem: > > * Is your test case marked as a multidb test? (i.e., multidb=True on > the test case itself) > > * Can you describe your database configuration in more detaill? > Specifically, when the test framework creates the test database > (presumably on 'jellyroll') does a slave also get created > automatically? Is the test slave automatically paired to the test > master? > > Yours, > Russ Magee %-) >
Thanks, and sorry it took so long for me to revive this. I traced the problem to a replication error. Somehow, the primary database was getting created with the InnoDB engine, but the replicants were getting created with MyISAM. Cheers, Cliff -- 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.