django - 使用多个数据库时运行 makemigrations

标签 django

我已将 Django 项目设置为使用两个数据库。一个是只读的,另一个是项目其余部分的“默认”django 数据库。

以下是设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'sipf',
        'USER': 'myusername',
        'PASSWORD': 'secret',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
    ,
    'my_read_only_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_read_only_db',
        'USER': 'myusername',
        'PASSWORD': 'mypassword',
        'HOST': 'remote.host.edu',
    }
}

这是只读数据库的 router.py:

class MyReadOnlyDBRouter(object):

    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'my_read_only_db':
            return 'my_read_only_db'
        return None

对于默认数据库:

class PrimaryRouter(object):
    def db_for_read(self, model, **hints):
        return 'default'

    def db_for_write(self, model, **hints):
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = 'default'
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

最后是设置中的路由:

DATABASE_ROUTERS = ['my_read_only_db.router.MyReadOnlyDBRouter', 'common.router.PrimaryRouter']

我知道运行 migrate 时需要指定要运行的数据库,如下所示:

$ ./manage.py migrate --database=default

但是,在达到这一目标之前,需要运行 makemigrations。在这里,它显然试图在只读数据库中创建表,我得到:

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1142, "CREATE command denied to user 'user'@'example.com' for table 'django_migrations'"))

而它甚至不应该尝试执行此操作,因为 django_migrations 表应该位于具有写入功能的默认数据库中。

最佳答案

来自 django 源代码,django/core/management/commands/makemigrations.py:

# Non-default databases are only checked if database routers used.
aliases_to_check = connections if settings.DATABASE_ROUTERS else [DEFAULT_DB_ALIAS]
for alias in sorted(aliases_to_check):
    connection = connections[alias]
    if (connection.settings_dict['ENGINE'] != 'django.db.backends.dummy' and any(
            # At least one model must be migrated to the database.
            router.allow_migrate(connection.alias, app_label, model_name=model._meta.object_name)
            for app_label in consistency_check_labels
            for model in apps.get_app_config(app_label).get_models()
    )):
        loader.check_consistent_history(connection)

如果您使用数据库路由器,它将尝试检查每个数据库连接的一致历史记录。如果您通过注释掉配置来临时禁用数据库路由器或只读数据库,则可以运行 makemigrations 而无需建立数据库连接,然后您可以将它们添加回来。

关于django - 使用多个数据库时运行 makemigrations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46248065/

相关文章:

python - Django - 如何获取与另一个字段相关的upload_to目录

python - 当我进行聚合查询时,Django 模型管理器无法处理相关对象

regex - 当正则表达式在数据库中并且值为字符串时使用 Django ORM Postgresql 正则表达式

django - "Column ' 创建日期时间 ' cannot be null"Django

python - matplotlib matshow 标签

javascript - 在django模板中单击按钮时播放音频

django - 无效的命令 'WSGIScriptAlias' ,可能拼写错误或由未包含在服务器配置中的模块定义

python - django 中的 Slug 字段错误

python - Django表单数据回复与显示

django - 自定义 Django 应用程序和贡献/merge 上游的工作流