Как я могу использовать хранимые процедуры в Django с MySQL и запускать 'python manage.py migrate' без проблем?
Контекст: Я работаю над проектом, используя Django с фреймворком Django REST для создания API. Моя база данных - MySQL, а в качестве локальной среды разработки я использую XAMPP.
Проблема: Мне нужно использовать хранимые процедуры в моем Django-приложении для выполнения определенных операций в моей базе данных MySQL. Однако я столкнулся с трудностями интеграции хранимых процедур с Django, а также с проблемами при запуске python manage.py migrate.
Дополнительная информация:
- Я создал хранимые процедуры непосредственно в моей базе данных MySQL с помощью phpMyAdmin.
- Я использую ORM Django для взаимодействия с базой данных в других частях моего приложения.
- Я хотел бы иметь возможность вызывать хранимые процедуры из моего Django-приложения и запускать python manage.py migrate без ошибок, чтобы убедиться, что моя база данных правильно синхронизирована с моделями Django.
Соответствующие файлы и код:
file | description |
---|---|
utils.py |
File containing the calls to the stored procedures. |
models.py |
File where I define Django models representing my database schema. |
Вопросы:
- Каким образом лучше всего использовать хранимые процедуры в Django, особенно с базой данных MySQL?
- Как обеспечить совместимость хранимых процедур с процессом миграции Django (python manage.py migrate)?
- Есть ли какие-то особые соображения, о которых я должен знать при работе с хранимыми процедурами в Django?
Любое руководство или практические примеры были бы очень признательны. Спасибо!
После выполнения этой команды вы получите следующий результат:
python manage.py migrate
Результат:
Utils.py
from django.db import connection
def callSalesLastWeekAmount():
with connection.cursor() as cursor:
cursor.callproc('SalesLastWeekAmount')
result = cursor.fetchall()
return result
def callSalesLastWeekQuantity():
with connection.cursor() as cursor:
cursor.callproc('SalesLastWeekQuantity')
result = cursor.fetchall()
return result
def callSalesLastWeekAmountSeller(seller):
with connection.cursor() as cursor:
cursor.callproc('SalesLastWeekAmountSeller', [seller])
result = cursor.fetchall()
return result
def callSalesLastWeekQuantitySeller(seller):
with connection.cursor() as cursor:
cursor.callproc('SalesLastWeekQuantitySeller', [seller])
result = cursor.fetchall()
return result
def callSalesDateRangeAmount(date_start, date_end):
with connection.cursor() as cursor:
cursor.callproc('SalesDateRangeAmount', [date_start, date_end])
result = cursor.fetchall()
return result
def callSalesDateRangeQuantity(date_start, date_end):
with connection.cursor() as cursor:
cursor.callproc('SalesDateRangeQuantity', [date_start, date_end])
result = cursor.fetchall()
return result
def callSalesDateRangeSellerAmount(date_start, date_end, seller):
with connection.cursor() as cursor:
cursor.callproc('SalesDateRangeSellerAmount', [date_start, date_end, seller])
result = cursor.fetchall()
return result
def callSalesDateRangeSellerQuantity(date_start, date_end, seller):
with connection.cursor() as cursor:
cursor.callproc('SalesDateRangeSellerQuantity', [seller, date_start, date_end])
result = cursor.fetchall()
return result
models.py
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=50, unique=True, default=None)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
ventas_semana = models.IntegerField(default=0)
USERNAME_FIELD = "username"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
def as_dict(self):
return {
"id": self.id,
"username": self.username,
"password": self.password,
"email": self.email,
"ventas_semana": self.ventas_semana,
"is_superuser": self.is_superuser,
"is_active": self.is_active
}
class Sale(models.Model):
#insertar campos
sale_id = models.AutoField(primary_key=True)
user_id = models.ForeignKey(User, editable=False, default=None, on_delete=models.DO_NOTHING)
amount = models.FloatField(default=0)
quantity = models.IntegerField(default=0)
date = models.DateTimeField(default=now, editable=False)
is_active = models.BooleanField(default=True)
def as_dict(self):
return {
"amount": self.amount,
"user_id": self.user_id.id,
"quantity": self.quantity,
"date": self.date,
"sale_id": self.sale_id,
"is_active": self.is_active
}
views.py
SQL-ПРОЦЕДУРЫ
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesDateRangeSellerAmount$$
CREATE PROCEDURE SalesDateRangeSellerAmount(IN start_date DATE, IN end_date DATE, IN user_id INT)
BEGIN
SELECT SUM(amount) as day_amount, DATE(date) AS day
FROM apirest_sale
WHERE date BETWEEN start_date AND end_date
AND user_id_id = user_id
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesDateRangeSellerQuantity$$
CREATE PROCEDURE SalesDateRangeSellerQuantity(IN start_date DATE, IN end_date DATE, IN user_id INT)
BEGIN
SELECT SUM(quantity) as day_quantity, DATE(date) AS day
FROM apirest_sale
WHERE date BETWEEN start_date AND end_date
AND user_id_id = user_id
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesDateRangeAmount$$
CREATE PROCEDURE SalesDateRangeAmount(IN start_date DATE, IN end_date DATE)
BEGIN
SELECT SUM(amount) as day_amount, DATE(date) AS day
FROM apirest_sale
WHERE date BETWEEN start_date AND end_date
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesDateRangeQuantity$$
CREATE PROCEDURE SalesDateRangeQuantity(IN start_date DATE, IN end_date DATE)
BEGIN
SELECT SUM(quantity) as day_quantity, DATE(date) AS day
FROM apirest_sale
WHERE date BETWEEN start_date AND end_date
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesLastWeekAmountSeller$$
CREATE PROCEDURE SalesLastWeekAmountSeller(IN user_id INT)
BEGIN
SELECT SUM(amount) as day_amount, DATE(date) AS day
FROM apirest_sale
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND user_id_id = user_id
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesLastWeekQuantitySeller$$
CREATE PROCEDURE SalesLastWeekQuantitySeller(IN user_id INT)
BEGIN
SELECT SUM(quantity) as day_quantity, DATE(date) AS day
FROM apirest_sale
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND user_id_id = user_id
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesLastWeekAmount$$
CREATE PROCEDURE SalesLastWeekAmount()
BEGIN
SELECT SUM(amount) as day_amount, DATE(date) AS day
FROM apirest_sale
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS SalesLastWeekQuantity$$
CREATE PROCEDURE SalesLastWeekQuantity()
BEGIN
SELECT SUM(quantity) as day_quantity, DATE(date) AS day
FROM apirest_sale
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND is_active = 1
GROUP BY DATE(date);
END$$
DELIMITER ;