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

时间:2017-06-14 07:32:54

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

我正在使用两个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是我的默认架构)。 声明我的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分别查询这两个表。 任何关于此的帮助/主角都会有所帮助。提前致谢。

1 个答案:

答案 0 :(得分:0)

根据您的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',]
    
  4. 检查有关数据库路由的docs