如何使用django在mysql的两个不同模式中使用两个同名表

如何使用django在mysql的两个不同模式中使用两个同名表,mysql,django,python-3.x,django-orm,Mysql,Django,Python 3.x,Django Orm,我使用的是两个mysql模式X和Y,它们都包含多个表,但有一个表在这两个模式中具有相同的名称 这两种模式如下所示: +--------------+--+--------------+ | X | | Y | +--------------+--+--------------+ | name | | album_info | +--------------+--+--------------+ | invite |

我使用的是两个mysql模式X和Y,它们都包含多个表,但有一个表在这两个模式中具有相同的名称

这两种模式如下所示:

+--------------+--+--------------+
| X            |  | Y            |
+--------------+--+--------------+
| name         |  | album_info   |
+--------------+--+--------------+
| invite       |  | photo_info   |
+--------------+--+--------------+
|   photo      |  |   photo      |
+--------------+--+--------------+
| user_details |  | temp         |
+--------------+--+--------------+
现在,我想查询这两个表,但当我在models.py文件中使用相同的名称编写表结构时,它会抛出错误/异常。 我在routers.py文件中声明了这两个表,如下所示:

  modelDatabaseMap = {
    .
    'photo': 'default',
    .
    .
    .
    'photo': 'y',
}
 class Photo(models.Model):
     id = models.AutoField(db_column='ID', primary_key=True)
     has_tagged_with = models.IntegerField()
     has_reposted_with = models.IntegerField()
     .
     .

     class Meta:
        managed = False
        db_table = 'photo'

 class Photo(models.Model):
     id = models.AutoField(db_column='ID', primary_key=True)
     account_id = models.IntegerField()
     p_id = models.IntegerField()
     is_profile = models.IntegerField()
     .
     .

     class Meta:
        managed = False
        db_table = 'photo'
(X是我的默认模式)。 声明的i models.py如下所示:

  modelDatabaseMap = {
    .
    'photo': 'default',
    .
    .
    .
    'photo': 'y',
}
 class Photo(models.Model):
     id = models.AutoField(db_column='ID', primary_key=True)
     has_tagged_with = models.IntegerField()
     has_reposted_with = models.IntegerField()
     .
     .

     class Meta:
        managed = False
        db_table = 'photo'

 class Photo(models.Model):
     id = models.AutoField(db_column='ID', primary_key=True)
     account_id = models.IntegerField()
     p_id = models.IntegerField()
     is_profile = models.IntegerField()
     .
     .

     class Meta:
        managed = False
        db_table = 'photo'
现在,歧义首先出现在名称中,其次出现在models.py中的声明中,其次出现在查询中。
我一直在研究如何通过orm分别查询这两个表关于这方面的任何帮助/线索都会很有帮助。提前感谢。

根据您的
数据库配置,您可以尝试:

  • 更改您的型号名称或为每个模式创建具有不同<代码>型号模块的新应用程序:

    class YPhoto(models.Model):
        ...
    
    class XPhoto(models.Model):
        ...
    
  • 创建一个
    router.py
    模块:

    class MyRouter(object):
    
    def db_for_read(self, model, **hints):
        if model.__name__ == 'YPhoto':
            return 'Y'
        return None
    
    def db_for_write(self, model, **hints):
        if model.__name__ == 'YPhoto':
            return 'Y'
        return None
    
    def allow_relation(self, obj1, obj2, **hints):
        # Maybe you want to prevent relations between different schemas, it's up to you
        return True
    
    def allow_syncdb(self, db, model):
        return True
    
  • 将路由器添加到
    设置.py

    DATABASE_ROUTERS = ['myapp.models.MyRouter',]
    

  • 检查关于数据库路由的链接。

    每个架构都有连接吗?您的
    数据库如何配置?数据库配置如下:
    数据库={'default':{'ENGINE':'django.contrib.gis.db.backends.mysql','NAME':'X','USER':数据库\用户名,'PASSWORD':数据库\密码,'HOST':数据库\主机\名称,'PORT':'3306','OPTIONS':{'charset':'utf8mb4'},}}
    与我在字典中添加模式Y的方式相同。这就是重点。您有两个数据库配置?一个是
    默认值
    ,另一个是
    Y
    ,例如?我没有两个db配置,默认值和Y两个模式都在数据库中提到={}我只有一个数据库configDATABASES={'default':{'ENGINE':'django.contrib.gis.db.backends.mysql','NAME':'X','USER':,'PASSWORD','HOST':,'PORT':'3306','OPTIONS':{'charset':'utf8mb4'},},'y':{'ENGINE':'django.contrib.gis.db.backends.mysql','NAME':'y','USER','PASSWORD:'HOST','PORT':'3306','OPTIONS':{'charset':'utf8mb4'},},}哎呀,我注意到你必须在
    if
    s中检查
    Y
    schema中的所有表。也许你最好为
    Y
    schemaThanks中的表创建一个新的应用程序,试试这个。我要求回答我的另一个问题,链接如下: