在SQLalchemy中设置值之后,如何约束以不变的限制

发布于 2025-01-23 12:19:16 字数 1485 浏览 0 评论 0原文

我现在有以下模型

class Card(Base):
    __tablename__ = 'Cards'
    __table_args__ = (
        db.Index(
            'one_active_code_only',
            'code', 'company',
            unique=True,
            postgresql_where='used_by is NULL'
        ),
        db.CheckConstraint(
            '(used_by IS NULL AND used_at IS NULL) OR (used_by IS NOT NULL AND used_at IS NOT NULL)',
            name='used_by and used_at must be set together'
        ),
        db.CheckConstraint(
            '(booked_by IS NULL AND booked_at IS NULL) OR (booked_by IS NOT NULL AND booked_at IS NOT NULL)',
            name='booked_by and booked_by must be set together'
        ),
    )

    name = db.Column(db.String(100), nullable=False)
    code = db.Column(db.String(100), nullable=False)
    value = db.Column(db.Numeric, nullable=False)
    company = db.Column(db.ForeignKey('Companies.id'), nullable=False)
    img = db.Column(db.String, nullable=True)

    booked_at = db.Column(db.DateTime, nullable=True)
    booked_by = db.Column(db.ForeignKey('Users.id'), nullable=True)

    used_at = db.Column(db.DateTime, nullable=True)
    used_by = db.Column(db.ForeignKey('Users.id'), nullable=True)

,我想要约束used_by booked_by 在第一个值集之后无法改变。

我该如何实现?

我不想在服务器中实现之前的问题机制,我想直接在数据库中实现它,以防止从另一个数据库客户端更改数据。

需求.txt

Flask==2.1.1
Flask-SQLAlchemy==2.5.1
SQLAlchemy==1.4.35
...
...
...

I have the following model

class Card(Base):
    __tablename__ = 'Cards'
    __table_args__ = (
        db.Index(
            'one_active_code_only',
            'code', 'company',
            unique=True,
            postgresql_where='used_by is NULL'
        ),
        db.CheckConstraint(
            '(used_by IS NULL AND used_at IS NULL) OR (used_by IS NOT NULL AND used_at IS NOT NULL)',
            name='used_by and used_at must be set together'
        ),
        db.CheckConstraint(
            '(booked_by IS NULL AND booked_at IS NULL) OR (booked_by IS NOT NULL AND booked_at IS NOT NULL)',
            name='booked_by and booked_by must be set together'
        ),
    )

    name = db.Column(db.String(100), nullable=False)
    code = db.Column(db.String(100), nullable=False)
    value = db.Column(db.Numeric, nullable=False)
    company = db.Column(db.ForeignKey('Companies.id'), nullable=False)
    img = db.Column(db.String, nullable=True)

    booked_at = db.Column(db.DateTime, nullable=True)
    booked_by = db.Column(db.ForeignKey('Users.id'), nullable=True)

    used_at = db.Column(db.DateTime, nullable=True)
    used_by = db.Column(db.ForeignKey('Users.id'), nullable=True)

Now I want constraints used_by and booked_by to be unchangeable after the first value set.

How can I achieve that?

I don't want to implement the before-query mechanism in the server, I want to implement it within the database directly, to prevent changing data from another database client.

requirements.txt

Flask==2.1.1
Flask-SQLAlchemy==2.5.1
SQLAlchemy==1.4.35
...
...
...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文