2015-07-29 19 views
17

Tôi biết đối tượng con trỏ ở Django. Có cách nào ưu tiên khác để thực thi SQL thô trong di chuyển không? Tôi muốn giới thiệu phân vùng postgresql cho một trong các bảng mô hình của tôi. Logic phân vùng là một loạt các hàm và trình kích hoạt cần phải được thêm vào cơ sở dữ liệu khi thiết lập mà tôi muốn tự động hóa.Làm cách nào để thực thi SQL thô trong di chuyển django

Trả lời

29

Một cách:

Cách tốt nhất mà tôi tìm thấy để làm điều này là sử dụng RunSQL:

Migrations chứa các lớp RunSQL. Để làm điều này:

  1. ./manage.py makemigrations --empty myApp
  2. chỉnh sửa di cư tạo ra tập tin bao gồm:

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

Như Nathanial Knight đã đề cập, RunSQL cũng chấp nhận một tham số reverse_sql cho đảo ngược sự di cư. See the docs for details

Một cách khác

Con đường tôi giải quyết vấn đề của tôi ban đầu đã sử dụng các tín hiệu post_migrate để gọi một con trỏ để thực hiện SQL liệu của tôi.

Những gì tôi có để thêm vào ứng dụng của tôi là thế này:

trong __init__.py của MyApp thêm:

default_app_config = 'myApp.apps.MyAppConfig' 

Tạo một file 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) 

mới tập 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 số manage.py syncdb hoặc manage.py migrate chức năng này được gọi. Vì vậy, hãy đảm bảo sử dụng CREATE OR REPLACEIF NOT EXISTS. Vì vậy, nó có thể xử lý các chức năng hiện có.

+0

Có cách nào để thêm di chuyển ngược cho sql suctom không? – DataGreed

+0

Bạn nên thực sự di chuyển ghi chú của mình về RunSQL lên đầu. Nó hoàn toàn là cách tốt nhất để làm điều này ... –

+0

@DataGreed Không chắc chắn nếu bạn vẫn muốn biết, nhưng bạn có thể vượt qua một chuỗi SQL thứ 2 được sử dụng như là sql đảo ngược. – LarrikJ

Các vấn đề liên quan