Как я могу использовать хранимые процедуры в 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 ;

Вернуться на верх