如何在 Django 迁移中执行原始 SQL
How do I execute raw SQL in a django migration
我知道 Django 中的游标对象。在迁移中是否还有其他首选方法来执行原始 SQL ?我想为我的一个模型表引入 postgresql 分区。分区逻辑是一堆函数和触发器,必须在设置时添加到我想自动化的数据库中。
一种方式:
我发现最好的方法是使用 运行SQL:
迁移包含 运行SQL class。为此:
./manage.py makemigrations --empty myApp
- 编辑创建的迁移文件以包括:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
正如 Nathaniel Knight 提到的,RunSQL
还接受一个 reverse_sql
参数来反转迁移。 See the docs for details
另一种方式
我最初解决问题的方法是使用 post_migrate
信号调用游标来执行我的原始 SQL.
我必须添加到我的应用程序中的是:
在 myApp 的 __init__.py
添加:
default_app_config = 'myApp.apps.MyAppConfig'
创建文件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)
新建文件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.'
现在每 manage.py syncdb
或 manage.py migrate
调用此函数。所以确保它使用 CREATE OR REPLACE
和 IF NOT EXISTS
。所以它可以处理现有的功能。
我会推荐 django-migrate-sql-deux https://pypi.org/project/django-migrate-sql-deux/
通过这种方式,您可以像 Django 中的模型一样以声明方式管理视图、函数、触发器等数据库对象。然后您需要通过 makemigrations
生成对 Django 迁移的更改。并通过 migrate
应用它们。所以开发和部署流程非常相似。
如果 Django 有这个系统用于原始 SQL "models" 并在 makemigrations
和 migrate
命令中自动处理迁移和依赖关系,如 [=21],那就太棒了=]django-migrate-sql-deux.
我知道 Django 中的游标对象。在迁移中是否还有其他首选方法来执行原始 SQL ?我想为我的一个模型表引入 postgresql 分区。分区逻辑是一堆函数和触发器,必须在设置时添加到我想自动化的数据库中。
一种方式:
我发现最好的方法是使用 运行SQL:
迁移包含 运行SQL class。为此:
./manage.py makemigrations --empty myApp
- 编辑创建的迁移文件以包括:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
正如 Nathaniel Knight 提到的,RunSQL
还接受一个 reverse_sql
参数来反转迁移。 See the docs for details
另一种方式
我最初解决问题的方法是使用 post_migrate
信号调用游标来执行我的原始 SQL.
我必须添加到我的应用程序中的是:
在 myApp 的 __init__.py
添加:
default_app_config = 'myApp.apps.MyAppConfig'
创建文件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)
新建文件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.'
现在每 manage.py syncdb
或 manage.py migrate
调用此函数。所以确保它使用 CREATE OR REPLACE
和 IF NOT EXISTS
。所以它可以处理现有的功能。
我会推荐 django-migrate-sql-deux https://pypi.org/project/django-migrate-sql-deux/
通过这种方式,您可以像 Django 中的模型一样以声明方式管理视图、函数、触发器等数据库对象。然后您需要通过 makemigrations
生成对 Django 迁移的更改。并通过 migrate
应用它们。所以开发和部署流程非常相似。
如果 Django 有这个系统用于原始 SQL "models" 并在 makemigrations
和 migrate
命令中自动处理迁移和依赖关系,如 [=21],那就太棒了=]django-migrate-sql-deux.