首页 > 解决方案 > 处理 Django 迁移

问题描述

我们有一个使用数据库路由器的多数据库 Django 项目。

由于某种原因,当我们运行迁移时,对迁移的引用最终出现在 django_migrations 表中,但实际上并没有运行实际的迁移 - 也就是说 - 目标数据库没有变化。

以下是数据库的数据库路由器elegant

class ElegantRouter:
    """
    A router to control all database operations on models in the
    elegant application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read elegant models go to elegant.
        """
        if model._meta.app_label == 'elegant':
            return 'elegant'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write elegant models go to elegant.
        """
        if model._meta.app_label == 'elegant':
            return 'elegant'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the elegant app is involved.
        """
        if obj1._meta.app_label == 'elegant' or \
           obj2._meta.app_label == 'elegant':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the elegant app only appears in the 'elegant'
        database.
        """
        print('allow_migrate',app_label,db)
        if app_label == 'elegant':
            return db == 'elegant'
        return None

以下是项目的 DATABASES 设置。


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'depot_maestro': {
        'ENGINE': 'django_filemaker_pyodbc',
        'HOST': os.getenv('FILEMAKER_HOST'),
        'PORT': os.getenv('FILEMAKER_PORT'),
        'USER': os.getenv('FILEMAKER_USER'),
        'PASSWORD': os.getenv('FILEMAKER_PASSWORD'),
        'NAME': os.getenv('FILEMAKER_FILENAME'),
        'OPTIONS' : {
            'driver' : os.getenv('FILEMAKER_DRIVER'),
            'driver_supports_utf8' : True,
            'autocommit' : True ,
        },
        'TEST': {
            'NAME': os.getenv('FILEMAKER_FILENAME'),
            'SERIALIZE': False,
        }
    },
    'postgres': {
            'NAME': os.getenv('POSTGRES_DATABASE'),
            'ENGINE': 'django.db.backends.postgresql',
            'USER': os.getenv('POSTGRES_USER'),
            'PASSWORD': os.getenv('POSTGRES_PASSWORD')
    },
    'elegant': {
            'NAME': os.getenv('ELEGANT_DATABASE'),
            'ENGINE': 'django.db.backends.postgresql',
            'USER': os.getenv('ELEGANT_USER'),
            'PASSWORD': os.getenv('ELEGANT_PASSWORD')
    },
}

更新

sqlmigrate对带有数据库路由器的项目使用不返回 sql 。

./manage.py sqlmigrate elegant 0057 --database elegant
BEGIN;
--
-- Remove field internal_id from organisationelegant
--
--
-- Add field uuid to organisationelegant
--
--
-- Alter field id on organisationelegant
--
COMMIT;

没有数据库路由器的项目返回 SQL

./manage.py sqlmigrate elegant 0057
BEGIN;
--
-- Remove field internal_id from organisationelegant
--
ALTER TABLE "organisation" DROP COLUMN "id" CASCADE;
...
--
-- Alter field id on organisationelegant
--
DROP INDEX IF EXISTS "organisation_uuid_19796862_like";
COMMIT;

当 allow migrate 已经返回 true 并且正在生成迁移文件时,如何使使用数据库路由器的迁移生效?

标签: django

解决方案


我最终创建了一个新项目,其中使用相同的应用程序引用相同的数据库并从该项目迁移。

更新

我在主项目中添加了符号链接。


推荐阅读