Задать вопрос
@goony_prof

Корректно ли в данном случае отправляется запрос в базу данных?

Начал вкатываться в тему SQLAlchemy, валидации данных и backend в целом. После дня чтения статеек, решил собрать что-то самостоятельно, и своими силами даже прикрутил к модели таблицы валидацию данных через Pydantic.

Модель таблицы и модель данных для ее валидации (SQLAlhemy не предоставляет возможности кастомной валидации):
class Base(DeclarativeBase):
    pass

# Модель Pydantic для валидации данных
class StudentValidation(BaseModel):
    student_first_name: str
    student_last_name: str | None
    specialty: str  # Если это список строк
    enrolment: str

    @field_validator("student_first_name")
    def validate_student_first_name(cls, value):
        if len(value) > 50:
            raise ValueError("Длина имени не должна превышать 50 символов.")
        if value[0].isdigit():
            raise ValueError(f"Имя не должно начинаться с цифры: {value}")
        return value

    @field_validator("student_last_name")
    def validate_student_last_name(cls, value):
        if len(value) > 50:
            raise ValueError("Длина фамилии не должна превышать 50 символов.")
        if value[0].isdigit():
            raise ValueError(f"Фамилия не должна начинаться с цифры: {value}")
        return value
    
    @field_validator("specialty")
    def validate_specialty(cls, value):
        if value not in specialties:
            raise ValueError(f"Приведенная специальность -> {value}, в то время как список допустимых -> {specialties}")
        return value
# Модель SQLAlchemy для таблицы students
class Student(Base):
    __tablename__ = "students"
    student_id: Mapped[int] = mapped_column(primary_key=True)
    student_first_name: Mapped[str] = mapped_column(String(30))
    student_last_name: Mapped[str | None] = mapped_column(String(30))
    specialty: Mapped[str]
    enrolment: Mapped[str]


После чего был выполнено:
# Пример Данных для валидации и отправки в Бд 
data = {
    "student_first_name": "Alex",
    "student_last_name": "James",
    "specialty": "Психология",
    "enrolment": "2015"
}

#Функция добавление студента в базу
def insert_student(student: StudentValidation):
    student_db = Student(
        student_first_name=student.student_first_name,
        student_last_name=student.student_last_name,
        specialty=student.specialty,
        enrolment=student.enrolment
    )
    with Session(engine) as connection:
        connection.add(student_db)
        connection.commit()
        

insert_student(StudentValidation(**data))


И так, я написал модель данных, которая описывает студента, его айди (авто инкремент) и прочие поля, также через декораторы накидал немного дополнительных проверок. Затем через SQLAlchemy описал табличку со студентами и соответственно описал функцию, которая переводит модель из StudentValidation в Student и отправляет данные в БД.

Все это работает, но насколько корректно это выглядит? Можно ли каким-то образом это всё сократить, и как? Спрашиваю из личного интереса в рамках обучения.
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Есть сомнения по поводу корректности схемы, правил валидаций, названий полей но их нет смысла озвучивать, если нет описания решаемой задачи.

Например странно, что в модели студента есть поле "имя студента", как будто там может быть какое-то ещё имя, а просто "имя" будет не именем студента, а чем-то иным.

В остальном выглядит ок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы