从django迁移中排除数据库

时间:2017-08-18 08:43:49

标签: django sphinx django-migrations

有没有办法从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'")

2 个答案:

答案 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']

这将跳过在“默认”以外的数据库上的迁移。