sqlalchemy.exc.InvalidRequestError:创建数据类时遇到 Python 数据类错误:TypeError(“非默认参数)

sqlalchemy.exc.InvalidRequestError: Python dataclasses error encountered when creating dataclass : TypeError("non-default argument

提问人:KALAGA Serge Eric 提问时间:11/16/2023 更新时间:11/16/2023 访问量:37

问:

我正在使用 sqlalchemy 作为 orm 的 fastapi 项目: 我目前有这个错误:

sqlalchemy.exc.InvalidRequestError:为“User”创建数据类时遇到 Python 数据类错误:TypeError(“非默认参数'events' 跟随默认参数”)。有关其他信息,请参阅 Python 数据类文档。(此错误的背景见:https://sqlalche.me/e/20/dcte)

这是我的“models.py”文件

type python

from sqlalchemy import func, Integer, Boolean, DateTime, String, JSON, ForeignKey, Text
from sqlalchemy.orm import Mapped, mapped_column, MappedAsDataclass, DeclarativeBase, relationship
from api.database.basetemplate import BaseTemplate
from typing import Optional, List
from datetime import datetime
# from enum import Enum



class Base(MappedAsDataclass, DeclarativeBase):
    pass

class User(Base, BaseTemplate):
    __tablename__ = "user"
    id:Mapped[int] = mapped_column(primary_key=True, init=False, index=True)
    username:Mapped[str] = mapped_column(String(100), unique=True, index=True)
    password:Mapped[str] = mapped_column(String(100), nullable=False)
    image_url:Mapped[Optional[str]] = mapped_column(Text, nullable=True, default=None)
    nom:Mapped[Optional[str]] = mapped_column(String(100), default=None)
    prenom:Mapped[Optional[str]] = mapped_column(String(100), default=None) 
    telephone:Mapped[Optional[str]] = mapped_column(String(100), default=None)
    is_admin:Mapped[Optional[bool]] = mapped_column(Boolean, default=False)
    is_subscribed:Mapped[Optional[bool]] = mapped_column(Boolean, default=False)
    date_subscription:Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, default=None)
    date_creation:Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, server_default=func.now(), default=datetime.utcnow())
    
    events: Mapped[List["Event"]] = relationship("Event", back_populates="user", cascade="all, delete-orphan")


class Event(Base, BaseTemplate):
    __tablename__ = "event"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    nom:Mapped[str] = mapped_column(String(255), nullable=False)
    image_url:Mapped[Optional[str]] = mapped_column(Text, nullable=True, default=None)
    description:Mapped[Optional[str]] = mapped_column(Text, nullable=True, default=None)
    contacts:Mapped[Optional[str]] = mapped_column(String(255), nullable=True, default=None)
    categorie_id:Mapped[Optional[str]] = mapped_column(ForeignKey("event_category.id"), nullable=True, default=None)
    type_id:Mapped[Optional[str]] = mapped_column(ForeignKey("event_type.id"), nullable=True, default=None)
    lieu:Mapped[Optional[str]] = mapped_column(String(255), nullable=True, default=None)
    localisation:Mapped[Optional[str]] = mapped_column(String(255), nullable=True, default=None)
    date_creation:Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), default=datetime.utcnow())
    user_id:Mapped[int] = mapped_column(ForeignKey("user.id"), nullable=False)
     
    user: Mapped["User"] = relationship("User", back_populates="events")
    event_category: Mapped["EventCategory"] = relationship("EventCategory", back_populates="event_category")
    event_type: Mapped["EventType"] = relationship("EventType", back_populates="event_type")
    event_dates: Mapped[List["EventDates"]] = relationship("EventDates", back_populates="event", cascade="all, delete-orphan")
    event_likes: Mapped[List["EventLikes"]] = relationship("EventLikes", back_populates="event", cascade="all, delete-orphan")
    event_comments: Mapped[List["EventComments"]] = relationship("EventComments", back_populates="event", cascade="all, delete-orphan")


class EventLikes(Base, BaseTemplate):
    __tablename__ = "event_likes"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    user_id:Mapped[int] = mapped_column(ForeignKey("user.id"), nullable=False, default=None)
    event_id:Mapped[int] = mapped_column(ForeignKey("event.id"), nullable=False)
    user: Mapped["User"] = relationship("User", back_populates="event_likes")
    event: Mapped["Event"] = relationship("Event", back_populates="event_likes")

class EventComments(Base, BaseTemplate):
    __tablename__ = "event_comments"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    commentaire:Mapped[str] = mapped_column(Text, nullable=False)
    user_id:Mapped[int] = mapped_column(ForeignKey("user.id"), nullable=False)
    event_id:Mapped[int] = mapped_column(ForeignKey("event.id"), nullable=False)
    user: Mapped["User"] = relationship("User", back_populates="event_comments")
    event: Mapped["Event"] = relationship("Event", back_populates="event_comments")


class EventDates(Base, BaseTemplate):
    __tablename__ = "event_dates"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    date:Mapped[datetime] = mapped_column(DateTime, nullable=False)
    heure:Mapped[Optional[str]] = mapped_column(String(100), nullable=False)

    event_id:Mapped[int] = mapped_column(ForeignKey("event.id"), nullable=False)
    event: Mapped["Event"] = relationship("Event", back_populates="event_dates")


class EventCategory(Base, BaseTemplate):
    __tablename__ = "event_category"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    name:Mapped[str] = mapped_column(String(100), nullable=False)

    events: Mapped[List["Event"]] = relationship("Event", back_populates="event_category", cascade="all, delete-orphan")


class EventType(Base, BaseTemplate):
    __tablename__ = "event_type"
    id:Mapped[int] = mapped_column(primary_key=True, init=False)
    name:Mapped[str] = mapped_column(String(100), nullable=False)

    events: Mapped[List["Event"]] = relationship("Event", back_populates="event_type", cascade="all, delete-orphan")

请帮我解决问题

python sqlalchemy fastapi

评论

0赞 snakecharmerb 11/16/2023
当您尝试创建实例时,我看起来会发生这种情况。请编辑问题以分享相关代码和完整的错误回溯。User

答:

1赞 Serge Eric KALAGA 11/16/2023 #1

问题来自您的“基”类

class Base(DeclarativeBase, MappedAsDataclass):
    pass

由于您从“MappedAsDataclass”继承了它,因此我的 Event 模型的行为类似于 DataClass。 DataClass 考虑了定义参数的顺序(所有具有默认值的参数都位于没有默认值的参数之前) 这导致了错误:

sqlalchemy.exc.InvalidRequestError:为“Event”创建数据类时遇到 Python 数据类型错误:类型参数“user_id”跟在默认参数后面“)。有关此错误的其他理由,请参阅 Python 数据类文档:https://sqlalche.me/e/20/dcte)