【问题标题】:Create same model in multiple databases - Django在多个数据库中创建相同的模型 - Django
【发布时间】:2013-08-12 16:21:48
【问题描述】:

正如标题所示,我感兴趣的是如何在多个数据库中创建相同的模型。我有以下场景:每个用户都有自己的数据库(这是简化的情况),当用户向他的应用程序添加新模块时,我希望能够为他添加的模块创建 db 表。 我目前的想法是创建动态模型,添加自定义 app_label,然后使用在相应数据库中创建模型的数据库路由器。

有没有更简单的方法来获得这个?

提前致谢!

【问题讨论】:

  • 为什么会有这样的设置?您是否正在尝试进行多租户?如果是这样,有一个更简单的方法;以django-hosts 为例。
  • 嗨!是的,这就是我想要做的。我使用隔离方法,我的问题是我有一些通用模型(例如:CustomUsers 等),我希望能够在单独的数据库中为这些模型赋予生命。

标签: python django django-models


【解决方案1】:

您应该查看 syncdb 命令 - 您可以像这样以编程方式调用它:

from django.core.management import call_command
call_command('syncdb')

在您的情况下,您需要对在命令行中传入的任何选项使用命名参数:

call_command('syncdb', noinput=True, database=user_db)

希望对您有所帮助。

也请查看:https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code

【讨论】:

  • 感谢 TheBigC 的回复。确实,我也考虑了该选项,但我的问题是如何更改将添加模型的数据库?是同一个模型,但是根据添加模块的用户,会同步到不同的数据库中。
  • 我不确定我是否理解这个问题。 call_command 的数据库参数将包含您希望将模型添加到的数据库的名称(来自 settings.DATABASES) - 就像您将 --database 与 syncdb 命令一起使用一样。
  • 是的,它包含数据库的名称,但我的问题是如何告诉模型我希望它在运行时从 settings.DATABASES 同步到其中一个数据库中。我最终设法解决了这个问题,将其向下一层并使用 sql_create_model 并直接执行原始 SQL。
  • 使用 call_command(上图)就可以做到这一点——它允许您在运行时针对数据库调用 syncdb(您在调用 call_command 时指定数据库。)它发生在运行时,在您的查看等。
【解决方案2】:

使用带有不同参数的 migrate 命令。例如,如果您的数据库别名是主要和次要的

这样做

    python manage.py migrate --database=primary

    python manage.py migrate --databases=secondary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2023-03-09
    相关资源
    最近更新 更多