【问题标题】:Save the created by, updated by and deleted by information保存创建者、更新者和删除者信息
【发布时间】:2022-01-24 04:37:56
【问题描述】:

我正在尝试将有关创建、更新或删除记录的信息保存在每个表中。

目前我有以下:

class User(Base):
    __tablename__ = "user"

    id = Column(UUID, primary_key=True, index=True)
    
    civil_title = Column(Enum(EnumTitle))
    lastname = Column(String, index=True)
    firstname = Column(String)
    type = Column(Enum(EnumTypeUser))

    hashed_password = Column(String, nullable=False)
    is_active = Column(Boolean(), default=True)
    is_superuser = Column(Boolean(), default=False)

    created_at = Column(TIMESTAMP(timezone=False),server_default=func.now(), nullable=False)
    created_by = Column(UUID, ForeignKey("user.id"))
    created_by_rl = relationship("User", foreign_keys=[created_by])
    updated_at = Column(DateTime)
    updated_by = Column(UUID, ForeignKey("user.id"))
    updated_by_rl = relationship("User", foreign_keys=[updated_by])
    deleted_at = Column(DateTime)
    deleted_by = Column(UUID, ForeignKey("user.id"))
    deleted_by_rl = relationship("User", foreign_keys=[deleted_by])
    practice_id = Column(UUID, ForeignKey("practice.id"))
    practice = relationship("Practice", foreign_keys=[practice_id], back_populates="employees")

    address_id =  Column(UUID, ForeignKey("user_address.id"))
    address = relationship("UserAddress",foreign_keys=[address_id], back_populates="users")
    # items = relationship("Item", back_populates="owner")

    contacts = relationship("UserContactDetail", back_populates="user")

    schedules = relationship("Schedule", back_populates="user")

    __mapper_args__ = {
        "polymorphic_identity":"user",
        "polymorphic_on":type
    }

class UserAddress(Base):
    __tablename__ = "user_address"

    id = Column(UUID, primary_key=True, index=True)
    
    street = Column(String)
    streetnumber = Column(String)
    town = Column(String)
    cp = Column(Integer)

    created_at = Column(TIMESTAMP(timezone=False),server_default=func.now(), nullable=False)
    created_by = Column(UUID, ForeignKey("user.id"))
    created_by_rl = relationship("User", foreign_keys=[created_by])
    updated_at = Column(DateTime)
    updated_by = Column(UUID, ForeignKey("user.id"))
    updated_by_rl = relationship("User", foreign_keys=[updated_by])
    deleted_at = Column(DateTime)
    deleted_by = Column(UUID, ForeignKey("user.id"))
    deleted_by_rl = relationship("User", foreign_keys=[deleted_by])

    users = relationship("User", back_populates="address")

我遇到以下错误:

sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'user_address' and 'user'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

如何确保不会发生此错误? 做这样的事情是个好习惯吗?

【问题讨论】:

    标签: python sqlalchemy fastapi


    【解决方案1】:

    您正在向所有这些列添加错误定义的关系,这就是该错误的原因。为了解决你的问题,我会尝试这样的事情:

    class TrackTimeMixin:
    
        created_at = Column(DateTime, server_default=func.now())
    
        updated_at = Column(DateTime, server_default=func.now(), onupdate=datetime.now)
    
    class SoftDeleteMixin:
        deleted_at = Column(DateTime, nullable=True)
    
        def soft_delete(self):
            self.deleted_at = datetime.now()
    
    
    class User(Base, TrackTimeMixin, SoftDeleteMixin):
        """define other columns"""
    
    class UserAddress(Base, TrackTimeMixin, SoftDeleteMixin):
        """define other columns"""
    
    

    TrackTimeMixin 用于created_atupdated_at 列,它应该 自动工作。

    SoftDeleteMixin 添加deleted_at 列,您需要添加更多逻辑才能使其正常工作。

    我有意将其拆分为 2 个 mixin,因为对于其他一些模型,您可能只想使用其中一个或不使用其中一个。所以现在,当你想删除一个用户时,你而不是这样做:

    session.delete(user)
    session.commit()
    

    你实际上会这样做:

    user.soft_delete()
    session.commit()
    

    您还需要一个逻辑来获取未删除的用户,但从这一点开始应该很容易实现。

    【讨论】:

    • 我应该使用相同的 Mixins 来保存与创建、更新和删除相关的用户信息吗?
    • 对,你可以在任何你需要的模型中添加这个mixins,然后这些列将被添加到该模型的其他列中。 created_atupdated_at 的信息将自动保存,而 deleted_at 则必须使用 soft_delete 方法
    • 我使用@declared_attr标志stackoverflow.com/questions/9183012/…为用户外键提供的答案。谢谢!
    猜你喜欢
    • 2019-07-01
    • 2016-11-19
    • 2018-10-10
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多