首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sqlalchemy.exc.IntegrityError:(sqlite3.IntegrityError) NOT NULL约束失败

sqlalchemy.exc.IntegrityError:(sqlite3.IntegrityError) NOT NULL约束失败
EN

Stack Overflow用户
提问于 2021-01-25 01:50:16
回答 1查看 476关注 0票数 0

我重新开始学习编程,然后我遇到了问题。我正在使用flask wtffroms,只想创建一个删除路由,每次我尝试删除我的帖子时,我都会收到这个错误

代码语言:javascript
运行
复制
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: prekes_nuotraukos.preke_id
[SQL: UPDATE prekes_nuotraukos SET preke_id=? WHERE prekes_nuotraukos.id = ?]
[parameters: ((None, 20), (None, 21), (None, 22), (None, 23))]
(Background on this error at: http://sqlalche.me/e/13/gkpj)

我认为问题是我对两个sqlalchemy表使用了一个wtfform变量,但它找不到prekes_nuotraukos.id,因为它在不同的表中,或者我遗漏了什么。这是我的model.db

代码语言:javascript
运行
复制
class Preke(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    pavadinimas = db.Column(db.String(30), nullable=False)
    apibudinimas = db.Column(db.String(80), nullable=False)
    creation_time = db.Column(db.DateTime, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    items = db.relationship("PrekesNuotraukos", backref="PrekesFT", lazy=True, uselist=True)

    def __repr__(self):
        return f"Post('{self.pavadinimas}', '{self.apibudinimas}', {self.creation_time})"

class PrekesNuotraukos(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    prekes_nuotraukos = db.Column(db.String(20), nullable=False)
    creation_time = db.Column(db.DateTime, default=datetime.utcnow)
    preke_id = db.Column(db.Integer, db.ForeignKey("preke.id"), nullable=False)

    def __repr__(self):
        return f"Post('{self.creation_time}, {self.prekes_nuotraukos})"

和前端部分的代码

代码语言:javascript
运行
复制
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <form action="{{url_for('delete_Preke', p_id=preke.id)}}" method="post">
              <input class="btn btn-danger" type="submit" value="Delete">
          </form>

路由代码:

代码语言:javascript
运行
复制
@app.route("/app_main_page/preke/<int:p_id>/delete",  methods=["POST"])
@login_required
def delete_Preke(p_id):
    preke = Preke.query.get_or_404(p_id)
    if preke.author != current_user:
        abort(403)
    db.session.delete(preke)
    db.session.commit()
    flash("Jusu preke buvo sekmingai istrinta", "success")
    return redirect(url_for(visos_prekes))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-25 03:07:30

这个示例代码(纯SQLAlchemy,恐怕不是Flask-SQLAlchemy,但它们非常相似)展示了添加delete级联如何消除删除时的错误。

代码语言:javascript
运行
复制
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import orm


Base = declarative_base()


class Preke(Base):
    __tablename__ = 'preke'
    id = sa.Column(sa.Integer, primary_key=True)
    pavadinimas = sa.Column(sa.String(30), nullable=False)
    # If we remove the "cascade='...'" from the next line, we get the error.
    items = sa.orm.relationship("PrekesNuotraukos", backref="PrekesFT", lazy=True, uselist=True, cascade='all, delete-orphan')


class PrekesNuotraukos(Base):
    __tablename__ = 'preke_nuotraukos'
    id = sa.Column(sa.Integer, primary_key=True)
    preke_id = sa.Column(sa.Integer, sa.ForeignKey("preke.id"), nullable=False)


engine = sa.create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)

Session = orm.sessionmaker(engine)
session = Session()

p = Preke(pavadinimas='A')
session.add(p)
pk1 = PrekesNuotraukos(PrekesFT=p)
pk2 = PrekesNuotraukos(PrekesFT=p)
session.add_all([pk1, pk2])
session.commit()
session.close()

session = Session()
p = session.query(Preke).first()
session.delete(p)
session.commit()
session.close()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65874020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档