【问题标题】:Django DB Router Sending Table to default DB instead of Correct OneDjango DB路由器将表发送到默认数据库而不是正确的数据库
【发布时间】:2017-05-17 13:29:32
【问题描述】:

我正在创建一个将连接到 4 个数据库的站点。前三个没问题。我为每个数据库创建了一个单独的应用程序,然后为每个数据库创建了一个路由器。最后一个数据库的问题是路由器没有触发。它不断将流量发送到默认数据库。 默认数据库是app2,我要使用的数据库是'Login'。 这是我的路由器

 class LoginRouter(object):
     def db_for_read(self, model):

         if model._meta.app_label == 'Login':
             return 'Login'
         return 'default'

这是我的设置声明:

 DATABASE_ROUTERS = ['reports.dbrout.CucRouter', 'reports.dbrout.CpsgRouter', 'reports.dbrout.LoginRouter', ]

这是“登录”应用程序中未连接到正确数据库的模型。

 from __future__ import unicode_literals

 from django.db import models


 class TblUsers(models.Model):
     userid = models.AutoField(db_column='userID', primary_key=True)
     username = models.CharField(db_column='userName', max_length=100)  
     useremail = models.CharField(db_column='userEmail', unique=True, max_length=100) 
     userpass = models.CharField(db_column='userPass', max_length=100) 
     userstatus = models.CharField(db_column='userStatus', max_length=1)  
     tokencode = models.CharField(db_column='tokenCode', max_length=100)  
     companyid = models.CharField(db_column='companyID', max_length=255, blank=True, null=True)
     fk_customer = models.IntegerField(blank=True, null=True)
     is_admin = models.IntegerField(blank=True, null=True)

     class Meta:
         managed = False
         db_table = 'tbl_users'
         app_label = 'Login'

     def __str__(self):
         return str(self.userid)

完整的 dbout 页面:

 class CucRouter(object):
     def db_for_read(self, model):

         if model._meta.app_label == 'CUCMCDR':
             return 'CUCMCDR'
         return 'default'


  class CpsgRouter(object):
      def db_for_read(self, model):

         if model._meta.app_label == 'CPSG':
             return 'CUCMCDR'
         return 'default'


 class LoginRouter(object):
     def db_for_read(self, model):

         if model._meta.app_label == 'Login':
             return 'Login'
         return 'default'

就像我说的,这适用于前三个。我在这里错过了最后一个没有捕捉到的东西!!???

【问题讨论】:

  • 我认为我们需要更多信息。您能否包含您要传递给 db_for_read 方法的模型声明?
  • 是的,我现在就编辑它
  • DATABASE_ROUTERS 的顺序很重要,所以首先添加reports.dbrout.LoginRouter 然后尝试。也许它会起作用。
  • @Sanjay 嘿,成功了!但是......它现在打破了其他人。列出这些以便他们不会这样做的正确方法是什么????
  • @Joe 你能提供DATABASES 的设置吗?

标签: python django django-models django-database


【解决方案1】:

处理路由器的顺序很重要。路由器将按照它们在DATABASE_ROUTERS 设置中列出的顺序进行查询。
像下面这样添加它。
DATABASE_ROUTERS = ['reports.dbrout.LoginRouter','reports.dbrout.CucRouter', 'reports.dbrout.CpsgRouter',]

在设置时确保您的订单,如果LoginRouterCucRouter 中使用了Login app_label,那么LoginRouter 将在CucRouter 之前处理

【讨论】:

  • 我现在已经这样设置了,它使登录应用程序工作,但它会破坏其他两个路由器。我只是转移了问题。我在自己的班级中拥有每个路由器。也许我可以 if/else 在一个类中链接路线??
  • @Joe,您可以添加所有有问题的路由器类吗?所以它会给出清晰的想法。
  • 是的,现在添加。
  • 现在在 LoginRoute 添加 return None 而不是 return 'default' 然后尝试。
  • 你我的朋友是 Django 英雄。那正是它的本来面目。谢谢你。我会把你的答案标记为正确!!!!
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多