Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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")