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

Posted

技术标签:

【中文标题】如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表【英文标题】:How to use two tables with same name in two different schema in mysql with django 【发布时间】:2017-11-16 05:23:39 【问题描述】:

我正在使用两个 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',

(X 是我的默认架构)。 声明 i models.py 如下:

 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 分别查询两个表。 对此的任何帮助/引导都会有所帮助。提前致谢。

【问题讨论】:

每个模式都有连接吗?你的DATABASES 配置如何? DATABASES 配置如下:DATABASES = 'default': 'ENGINE': 'django.contrib.gis.db.backends.mysql', 'NAME': 'X', 'USER': DATABASE_USERNAME, 'PASSWORD': DATABASE_PASSWORD, 'HOST': DATABASE_HOST_NAME, 'PORT': '3306', 'OPTIONS': 'charset': 'utf8mb4', 与我将模式 Y 添加到字典中的方式相同。 这就是重点。你有两个数据库配置?例如,一个default 和另一个y 我没有两个数据库配置,默认和 Y 两个模式都在 DATABASES = 中提到我只有一个 DATABASES 配置 DATABASES = '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', 【参考方案1】:

鉴于您的DATABASES 配置,您可以尝试:

    更改您的模型名称或为每个架构创建一个具有不同 models 模块的新应用:

    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
    

    将路由器添加到settings.py:

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

查看docs关于数据库路由的信息。

【讨论】:

糟糕,我注意到您必须检查ifs 中Y 架构中的所有表。也许您最好为Y 架构中的表创建一个新应用程序 谢谢,试试这个。 我要求回答我的另一个问题,链接如下:***.com/questions/44496101/…

以上是关于如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库

如何为使用两个数据库(mysql和mongo)的django项目编写单元测试

如何让 Django 使用不受支持的 MySQL 驱动程序,例如 gevent-mysql 或 Concurrence 的 MySQL 驱动程序?

使用mysql和django按日期时间删除数据库中的条目?

如何将 Django 模型从 mysql 迁移到 sqlite(或在任何两个数据库系统之间)?

django中怎么使用两个限定条件在mysql数据库中进行查询