【问题标题】:django select app(s) for syncdbdjango 为 syncdb 选择应用程序
【发布时间】:2023-04-07 17:01:01
【问题描述】:

首先:请不要问我:“你为什么需要这个?”。

现在问题本身:我在 INSTALLED_APPS 中安装了几个应用程序。数据库现在是空的,我只想同步一些应用程序。最简单的方法是什么?

我知道我可以基于 syncdb 编写我的自定义管理命令。但遗憾的是,syncdb 的设计方式是我必须复制/粘贴一大块代码,只更改一行。这是我想探索其他可能性的原因。

【问题讨论】:

    标签: python django django-syncdb syncdb django-manage.py


    【解决方案1】:

    您可以在模型的Meta 类中执行managed = False。设置此属性后,syncdb 不会为您管理应用程序的表。你可以阅读它here

    另一种方法是编写自定义路由器

    class MyAppRouter(object):
        """A router to control all database operations on models in
        the myapp application"""
    
        def db_for_read(self, model, **hints):
            pass
    
        def db_for_write(self, model, **hints):
            pass
    
        def allow_relation(self, obj1, obj2, **hints):
            pass
    
        def allow_syncdb(self, db, model):
            if model._meta.app_label in ['myapp1', 'myapp2']
                return False
    

    【讨论】:

    • 太麻烦了——我必须遍历所有应用程序中的所有模型,记住以前的标志状态,然后再恢复它。编写自定义命令更容易...
    • 不,我在自定义命令中调用了syncdb,它将模型数据从一个数据库导出到另一个数据库。如果在目标数据库中没有表,我想通过 syncdb 创建它们,但我只需要为我正在导出的应用程序创建表。
    • 不完全。我不想为迁移创建可重用的应用程序。您可以将源数据库和目标数据库指定为新管理命令的参数以及应迁移哪些数据的应用程序。使用路由器是无法实现的。
    • @mnowotka: 我使用this 通用路由器取得了巨大成功
    【解决方案2】:

    您可以安装django-extensions,启用它并使用它的有用命令,例如:

    ./manage.py sqldiff APP_NAME
    

    它将打印出一个 SQL 命令列表,您可以运行这些命令来按名称同步您的应用程序。

    这里的 Django 扩展文档:https://django-extensions.readthedocs.org/en/latest/

    【讨论】:

      【解决方案3】:

      这似乎有效 - python manage.py syncdb --database=NEW_APP_DB

      【讨论】:

        【解决方案4】:

        对于应用程序的启动迁移,有app_label 参数:

        <app_label>: 指定应用运行迁移,最多 最近的迁移。这也可能涉及运行其他应用程序的迁移, 由于依赖关系。

        例子

        ./manage.py migrate myapp
        

        Django's docs

        【讨论】:

          猜你喜欢
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          • 2011-07-14
          相关资源
          最近更新 更多