如何在django迁移中执行原始SQL

Dav*_*han 22 django postgresql database-partitioning django-migrations

我知道Django中的游标对象.在迁移中是否还有其他首选方法可以执行原始SQL?我想为我的一个模型表引入postgresql分区.分区逻辑是一系列功能和触发器,必须在我想要自动化的设置中添加到数据库中.

Dav*_*han 39

单程:

我发现这样做的最好方法是使用RunSQL:

迁移包含RunSQL类.去做这个:

  1. ./manage.py makemigrations --empty myApp
  2. 编辑创建的迁移文件以包括:

operations = [ migrations.RunSQL('RAW SQL CODE') ]

正如纳撒尼尔·奈特所提到的,RunSQL也接受了一个reverse_sql反转迁移的参数.有关详细信息,请参阅文档

其他方式

我最初解决问题的方法是使用post_migrate信号调用游标来执行我的原始SQL.

我必须添加到我的应用程序是这样的:

__init__.pymyApp中添加:

default_app_config = 'myApp.apps.MyAppConfig'
Run Code Online (Sandbox Code Playgroud)

创建一个文件apps.py:

from django.apps import AppConfig
from django.db.models.signals import post_migrate
from myApp.db_partition_triggers import create_partition_triggers


class MyAppConfig(AppConfig):
    name = 'myApp'
    verbose_name = "My App"

    def ready(self):
        post_migrate.connect(create_partition_triggers, sender=self)
Run Code Online (Sandbox Code Playgroud)

新文件db_partition_triggers.py:

from django.db import connection


def create_partition_triggers(**kwargs):
    print '  (re)creating partition triggers for myApp...'
    trigger_sql = "CREATE OR REPLACE FUNCTION...; IF NOT EXISTS(...) CREATE TRIGGER..."
    cursor = connection.cursor()
    cursor.execute(trigger_sql)
    print '  Done creating partition triggers.'
Run Code Online (Sandbox Code Playgroud)

现在在每个manage.py syncdbmanage.py migrate这个函数被调用.所以确保它使用CREATE OR REPLACEIF NOT EXISTS.所以它可以处理现有的功能.

  • 根据记录,“RunSQL”还接受“reverse_sql”参数来反转迁移。有关详细信息,请参阅文档:https://docs.djangoproject.com/en/1.11/ref/migration-operations/#runsql (2认同)