django - 处理 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 并且正在生成迁移文件时,如何使使用数据库路由器的迁移生效?
解决方案
我最终创建了一个新项目,其中使用相同的应用程序引用相同的数据库并从该项目迁移。
更新
我在主项目中添加了符号链接。