Начал вкатываться в тему 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 и отправляет данные в БД.
Все это работает, но насколько корректно это выглядит? Можно ли каким-то образом это всё сократить, и как? Спрашиваю из личного интереса в рамках обучения.