【问题标题】:How to use two tables with same name in two different schema in mysql with django如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表
【发布时间】: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'}, } }

标签: mysql django python-3.x django-orm


【解决方案1】:

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

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

    class YPhoto(models.Model):
        ...
    
    class XPhoto(models.Model):
        ...
    
  2. 创建一个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
    
  3. 将路由器添加到settings.py:

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

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

【讨论】:

  • 糟糕,我注意到您必须检查ifs 中Y 架构中的所有表。也许您最好为Y 架构中的表创建一个新应用程序
  • 谢谢,试试这个。
  • 我要求回答我的另一个问题,链接如下:stackoverflow.com/questions/44496101/…
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2012-05-21
  • 2013-07-25
  • 2011-07-25
  • 2014-09-22
相关资源
最近更新 更多