Một cách:
Cách tốt nhất tôi thấy để làm điều này là sử dụng RunSQL:
Migrations chứa lớp RunSQL. Để làm điều này:
-
./manage.py makemigrations --empty myApp
- chỉnh sửa tệp di chuyển đã tạo để bao gồm:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Như Nathaniel Knight đã đề cập, RunSQL
cũng chấp nhận reverse_sql
tham số để đảo ngược quá trình di chuyển. Xem tài liệu để biết chi tiết
Một cách khác
Cách tôi giải quyết vấn đề của mình ban đầu là sử dụng post_migrate
ra hiệu để gọi một con trỏ để thực thi SQL thô của tôi.
Những gì tôi phải thêm vào ứng dụng của mình là:
trong __init__.py
của myApp thêm:
default_app_config = 'myApp.apps.MyAppConfig'
Tạo tệp 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)
Tệp mới 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.'
Bây giờ trên mọi manage.py syncdb
hoặc manage.py migrate
hàm này được gọi. Vì vậy, hãy đảm bảo rằng nó sử dụng CREATE OR REPLACE
và IF NOT EXISTS
. Vì vậy, nó có thể xử lý các chức năng hiện có.