Django'dan saklı yordamları çağırma

Bu makalede, mssql-django arka ucunu kullanarak Django uygulamalarından SQL Server saklı yordamlarının nasıl oluşturulacağı ve çağrılacağı açıklanmaktadır.

Bir geçişte saklı yordam oluşturun

Django geçiş iş akışınızın bir parçası olarak depolanmış yordam oluşturmak için migrations.RunSQL kullanın:

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        ("myapp", "0001_initial"),
    ]

    operations = [
        migrations.RunSQL(
            sql="""
                CREATE PROCEDURE GetProductsByCategory
                    @CategoryName NVARCHAR(100)
                AS
                BEGIN
                    SET NOCOUNT ON;
                    SELECT id, name, price
                    FROM myapp_product
                    WHERE category = @CategoryName;
                END;
            """,
            reverse_sql="DROP PROCEDURE IF EXISTS GetProductsByCategory;",
        ),
    ]

Geçişi uygulayın:

python manage.py migrate

Saklı yordam çağırmak

Ham SQL ile saklı yordamları çağırmak için Django'ları connection.cursor() kullanın:

from django.db import connection

def get_products_by_category(category_name):
    with connection.cursor() as cursor:
        cursor.execute("EXECUTE GetProductsByCategory @CategoryName = %s;", [category_name])
        results = cursor.fetchall()
    return results

Birden çok parametreyle depolanmış yordamı çağırma

Birden çok parametreyi liste olarak geçirin:

from django.db import connection

def search_products(category_name, min_price):
    with connection.cursor() as cursor:
        cursor.execute(
            "EXECUTE SearchProducts @CategoryName = %s, @MinPrice = %s;",
            [category_name, min_price],
        )
        results = cursor.fetchall()
    return results

Sonuçlardan sütun adlarını okuma

cursor.description içinden sütun adlarına erişin:

from django.db import connection

def get_products_as_dicts(category_name):
    with connection.cursor() as cursor:
        cursor.execute("EXECUTE GetProductsByCategory @CategoryName = %s;", [category_name])
        columns = [col[0] for col in cursor.description]
        results = [dict(zip(columns, row)) for row in cursor.fetchall()]
    return results

Birden çok sonuç kümesini işleme

Bazı saklı yordamlar birden çok sonuç kümesi döndürür. Bunlar arasında gezinmek için kullanın cursor.nextset() :

from django.db import connection

def get_dashboard_data():
    with connection.cursor() as cursor:
        cursor.execute("EXECUTE GetDashboardData;")

        # First result set
        products = cursor.fetchall()

        # Move to second result set
        cursor.nextset()
        categories = cursor.fetchall()

    return products, categories

Django yöneticisini sarmalama

Daha temiz kod için özel bir yöneticide saklı yordam çağrılarını kapsülleyin:

from django.db import connection, models

class ProductManager(models.Manager):
    def by_category(self, category_name):
        with connection.cursor() as cursor:
            cursor.execute(
                "EXECUTE GetProductsByCategory @CategoryName = %s;",
                [category_name],
            )
            columns = [col[0] for col in cursor.description]
            return [dict(zip(columns, row)) for row in cursor.fetchall()]

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.CharField(max_length=100)

    objects = ProductManager()

Kullanım:

products = Product.objects.by_category("Electronics")