Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie SQL Server gespeicherte Prozeduren aus Django-Anwendungen mithilfe des mssql-django Back-Ends erstellt und aufgerufen werden.
Erstellen einer gespeicherten Prozedur in einer Migration
Dient migrations.RunSQL zum Erstellen einer gespeicherten Prozedur als Teil Ihres Django-Migrationsworkflows:
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;",
),
]
Wenden Sie die Migration an:
python manage.py migrate
Aufrufen einer gespeicherten Prozedur
Verwenden Sie Djangos connection.cursor() , um gespeicherte Prozeduren mit rohem SQL aufzurufen:
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
Aufrufen einer gespeicherten Prozedur mit mehreren Parametern
Übergeben Sie mehrere Parameter als Liste:
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
Spaltennamen aus den Ergebnissen lesen
Auf Spaltennamen aus cursor.description zugreifen:
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
Mehrere Ergebnismengen verarbeiten
Einige gespeicherte Prozeduren geben mehrere Resultsets zurück. Verwenden Sie cursor.nextset(), um zwischen ihnen zu navigieren:
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
In einen Django-Manager kapseln
Kapseln Sie gespeicherte Prozeduraufrufe in einem benutzerdefinierten Manager für saubereren Code:
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()
Verwendung:
products = Product.objects.by_category("Electronics")