有没有办法从django迁移中排除数据库?
我的django项目中有一个sphinxsearch数据库:
DATABASES['sphinxsearch'] = {
'ENGINE': 'sphinxsearch.backend.sphinx',
...
}
当我尝试运行manage.py makemigrations命令时,Django尝试运行
SHOW FULL TABLES
查询
导致错误,因为这是sphinxql的错误语法
File "C:\Anaconda\lib\site-packages\django\db\backends\mysql\introspection.py", line 56, in get_table_list
cursor.execute("SHOW FULL TABLES")
...
django.db.utils.ProgrammingError: (1064, "sphinxql: syntax error, unexpected IDENT, expecting VARIABLES near 'FULL TABLES'")
答案 0 :(得分:1)
此规则的一个例外是makemigrations命令。
它验证数据库中的迁移历史记录,以便在创建新迁移之前捕获现有迁移文件(可能由编辑它们引起)的问题。
默认情况下,它仅检查默认数据库,但如果安装了路由器,它会查询路由器的allow_migrate()
方法。
makemigrations
始终为模型更改创建迁移,但如果allow_migrate()
返回False
,则在db上运行迁移时,将以静默方式跳过对model_name的任何迁移操作。
为已经迁移的模型更改allow_migrate()
的行为可能会导致外键,额外表或缺少表的损坏。当makemigrations
验证迁移历史记录时,它会跳过不允许应用migrate
的数据库。
答案 1 :(得分:0)
class DBMigrateRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Allows migration for default DB
"""
return db == 'default'
将此类添加到设置文件
DATABASE_ROUTERS = ['path.to.DBMigrateRouter']
这将跳过在“默认”以外的数据库上的迁移。