如何使用django在mysql的两个不同模式中使用两个同名表
我使用的是两个mysql模式X和Y,它们都包含多个表,但有一个表在这两个模式中具有相同的名称 这两种模式如下所示:如何使用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 |
+--------------+--+--------------+
| 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中的表创建一个新的应用程序,试试这个。我要求回答我的另一个问题,链接如下: