python - sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 约束失败
问题描述
我最近开始学习编程,我遇到了问题。我正在使用烧瓶 wtffroms 并且只想创建一个删除路线,每次我尝试删除我的帖子时都会收到此错误
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)
我认为问题在于我对 2 个 sqlalchemy 表使用了一个 wtfform 变量,但它找不到 prekes_nuotraukos.id 因为它在不同的表中或者我遗漏了一些东西。这是我的model.db
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})"
和前端部分的代码
<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>
路由代码:
@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))
解决方案
此示例代码(纯 SQLAlchemy,恐怕不是 Flask-SQLAlchemy,但它们非常相似)显示了添加删除级联如何消除删除时的错误。
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()
推荐阅读
- javascript - 添加元素后触发 JavaScript 代码
- c# - 在同一解决方案中迁移两个不同项目中的多个 DbContext
- java - Hibernate 实体 id TABLE 生成器样式正在创建不一致的 ID 值
- vue.js - Vue - 如何验证来自 Vuex 存储的数据
- python - 如何在 Docker 中的 Python Django 模型中进行单元或集成测试
- gtkwave - 从 FSDB 显示 gtkwave 中的 verilog 结构
- java - 如何编写可以获取键盘按键之间时间的 Java 程序?
- javascript - 如何在 Angular js 中使用自定义 json 数据格式创建下拉列表
- apple-watch - 在 SwiftUI 中以编程方式使用 NavigationLink
- reactjs - 如何从链接中获取 alt 标签中的图像