Estoy moviendo un proyecto Django 1.8 de una configuración de base de datos única a una configuración de escritor/lector. Me encontré con el problema descrito en el error 23718 de Django, pero las soluciones descritas no parecían ayudar.
¿Alguien se ha encontrado con problemas similares? Los segmentos de código relevantes están a continuación:
Enrutador:
class DatabaseRouter(object): """Router to handle separation of reads and writes.""" def db_for_read(self, model, **hints): """Reads go to a read replica.""" return 'read' def db_for_write(self, model, **hints): """Writes always go to default.""" return 'default' def allow_relation(self, obj1, obj2, **hints): """Allow relations bet/n objects in the same DB cluster.""" db_list = ('default', 'read') if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): """All models end up in this pool.""" return True
configuración de base de datos relevante
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': DB_NAME, 'USER': DB_USER, 'PASSWORD': DB_PASS, 'HOST': DB_WRITE }, 'read': { 'ENGINE': 'django.db.backends.mysql', 'NAME': DB_NAME, 'USER': DB_USER, 'PASSWORD': DB_PASS, 'HOST': DB_READ, 'TEST': { 'MIRROR': 'default', }, } } DATABASE_ROUTERS = ['my_project.routers.DatabaseRouter']
evitar el caso de prueba de replicación:
class ReplicationTestCase(TestCase): @classmethod def setUpClass(cls): super(ReplicationTestCase, cls).setUpClass() connections['read']._orig_cursor = connections['read'].cursor connections['read'].cursor = connections['default'].cursor @classmethod def tearDownClass(cls): connections['read'].cursor = connections['read']._orig_cursor super(ReplicationTestCase, cls).tearDownClass()
¿Sale algo? Estoy feliz de proporcionar stacktraces de nuestro entorno de prueba si eso también fuera útil. ¡Gracias!