如何使用 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关于数据库路由的信息。
【讨论】:
糟糕,我注意到您必须检查if
s 中Y
架构中的所有表。也许您最好为Y
架构中的表创建一个新应用程序
谢谢,试试这个。
我要求回答我的另一个问题,链接如下:***.com/questions/44496101/…以上是关于如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库
如何为使用两个数据库(mysql和mongo)的django项目编写单元测试
如何让 Django 使用不受支持的 MySQL 驱动程序,例如 gevent-mysql 或 Concurrence 的 MySQL 驱动程序?