【发布时间】:2018-05-24 19:54:07
【问题描述】:
我需要从 Django 中不同的导入 MySQL 数据库中获取数据
(Django 1.11.7,Python 3.5.2)。
我运行manage.py inspectdb --database '<db>',然后在 django 中使用模型。
到目前为止,我只需要访问具有不同名称的表。为此,我在查询集中使用了using 关键字来指定适当的数据库,然后将结果连接起来,如下所示:
from ..models.db1 import Members
from ..models.db2 import Actor
context['db1_data'] = Members.objects.using('db1').filter...
context['db2_data'] = Actor.objects.using('db1').filter...
context["member_list"] = list(chain(
context["db1_data"],
context["db2_data"],
))
return context
现在我遇到的问题是两个数据库中存在具有相同模型名称的表。使用上述方法时出现以下错误(我替换了名称):
RuntimeError: Conflicting '<table-name>' models in application '<app>': <class '<app>.<subfolder>.models.<db1>.<table-name>'> and <class '<app>.<subfolder>.models.<db2>.<table-name>'>.
我已经尝试使用不同的名称导入模型,如下所示:
from ..models.db3 import Members as OtherMembers
但错误仍然出现。
from ..models.db1 和 from ..models.db2 是否应该足够清晰,让 Django 发现这两个模型之间的区别?
一种选择可能是重命名模型本身,但这意味着用相同的名称重命名每个数据库模型。由于我将来会使用更多的数据库,所以这不是我的选择。
我尝试了from models import db1, db2 然后db1.Members 等,仍然引发错误。
我读到了元 db_table = 'dbname.tablename'-option,但由于模型是通过 inspectdb 自动生成的,所以它已经在每个类上都有这样的东西:
class MyModel(models.Model):
<models>
class Meta:
managed = False
db_table = 'my_model'
如前所述,另一个数据库具有完全相同的模型,因此具有相同的元类。我不能也不想更改每个 Meta 类。
编辑:
我的项目结构如下:
app
-> admin.py
-> ...
-> models.py
-> views.py
subfolder
-> models
-> db1.py
-> db2.py
-> views
-> db1.py
-> db2.py
【问题讨论】:
-
我认为问题是,你定义了两个同名的模型类。您可以对任何数据库使用相同的模型(如果两者相同)。它非常适合我。
-
>>> chain(Build.objects.using('ob').all(), Build.objects.using('sb').all())
-
你是如何导入模型的?如果我从 shell 运行
from .models.db1 import Members和from .models.db2 import Members,我会收到上面描述的错误。 -
是否所有表都将不受管理?是否将两个数据库中的表导入到单个应用程序中?您是否在
settings.py中设置了两个数据库连接? -
是的,目前我们正在使用 sql 文件管理表。所有模型都放在一个文件中。
标签: python mysql django database