Flask 应用程序中的 Sqlalchemy 意外级联删除

树编码器

当我从我的数据库中删除一个项目时,我得到了一个奇怪的级联删除(我没有配置)。删除项对应的分类条目被删除。我如何阻止这种情况发生?

这是我的数据库设置:

from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine


Base = declarative_base()


class User(Base):
    """Object holding information about individual registered users"""

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    email = Column(String(250), nullable=False)
    picture = Column(String(250))


class Category(Base):
    """Object holding information about item categories"""

    __tablename__ = 'category'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)


class Item(Base):
    """Object holding information about individual catalog items"""

    __tablename__ = 'item'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    description = Column(String(5000), nullable=False)
    category_id = Column(Integer, ForeignKey('category.id'))
    category = relationship("Category")
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship("User")


engine = create_engine('postgresql+psycopg2://********:********'
                       + '/itemcatalog.db', echo=False)
Base.metadata.create_all(engine)

这是触发删除的代码:

@app.route('/item/<int:item_id>/delete/', methods=['GET', 'POST'])

def delete_item(item_id):
    item = session.query(Item).filter_by(id=item_id).one()

    if request.method == 'POST':
        session.delete(item)
        session.commit()
        flash('Item Successfully Deleted')
        return redirect(url_for('show_catalog'))
    else:
        return render_template('deleteitem.html', item=item,
                               username=login_session['username'],
                               picture=login_session['picture'])

预期的行为是仅删除由其“id”指定的项目,并且不会更改其他表。

我得到的实际结果是该item被删除,该item对应的category表中的条目也被删除了。

更新:

我正在采取的步骤是:

  1. 在数据库中创建一个新项目
  2. 删除该项目

显示这一点的日志(和删除)如下。

添加新项目:

2017-12-06 19:32:16 UTC [5383-22] [email protected] LOG:  statement: SELECT category.id AS category_id, category.name AS category_name 
    FROM category
2017-12-06 19:32:16 UTC [5383-23] [email protected] LOG:  statement: INSERT INTO item (name, description, category_id, user_id) VALUES ('Coffee', 'tasty beverage', 3, 2) RETURNING item.id
2017-12-06 19:32:16 UTC [5383-24] [email protected] LOG:  statement: COMMIT
2017-12-06 19:32:16 UTC [5383-25] [email protected] LOG:  statement: BEGIN
2017-12-06 19:32:16 UTC [5383-26] [email protected] LOG:  statement: SELECT category.id AS category_id, category.name AS category_name 
    FROM category ORDER BY category.name ASC
2017-12-06 19:32:16 UTC [5383-27] [email protected] LOG:  statement: SELECT item.id AS item_id, item.name AS item_name, item.description AS item_description, item.category_id AS item_category_id, item.user_id AS item_user_id 
    FROM item ORDER BY item.name ASC

删除新项目:

2017-12-06 19:33:14 UTC [5383-30] [email protected] LOG:  statement: SELECT item.id AS item_id, item.name AS item_name, item.description AS item_description, item.category_id AS item_category_id, item.user_id AS item_user_id 
    FROM item 
    WHERE item.id = 7
2017-12-06 19:33:14 UTC [5383-31] [email protected] LOG:  statement: SELECT category.id AS category_id, category.name AS category_name 
    FROM category 
    WHERE category.id = 3
2017-12-06 19:33:14 UTC [5383-32] [email protected] LOG:  statement: SELECT item.id AS item_id, item.name AS item_name, item.description AS item_description, item.category_id AS item_category_id, item.user_id AS item_user_id 
    FROM item 
    WHERE 3 = item.category_id
2017-12-06 19:33:14 UTC [5383-33] [email protected] LOG:  statement: UPDATE item SET category_id=NULL WHERE item.id = 5
2017-12-06 19:33:14 UTC [5383-34] [email protected] LOG:  statement: UPDATE item SET category_id=NULL WHERE item.id = 6
2017-12-06 19:33:14 UTC [5383-35] [email protected] LOG:  statement: DELETE FROM item WHERE item.id = 7
2017-12-06 19:33:14 UTC [5383-36] [email protected] LOG:  statement: DELETE FROM category WHERE category.id = 3
2017-12-06 19:33:14 UTC [5383-37] [email protected] LOG:  statement: COMMIT
2017-12-06 19:33:14 UTC [5383-38] [email protected] LOG:  statement: BEGIN
2017-12-06 19:33:14 UTC [5383-39] [email protected] LOG:  statement: SELECT category.id AS category_id, category.name AS category_name 
    FROM category ORDER BY category.name ASC
2017-12-06 19:33:14 UTC [5383-40] [email protected] LOG:  statement: SELECT item.id AS item_id, item.name AS item_name, item.description AS item_description, item.category_id AS item_category_id, item.user_id AS item_user_id 
    FROM item ORDER BY item.name ASC

从日志中我可以看到它的行为不像我想要的那样,但我不知道要改变什么来阻止这种行为。

树编码器

感谢您的回复 larsks,并为您的困惑感到抱歉。我的错误很愚蠢……我创建了一个新的数据库设置文件用于测试目的,但忘记在我的主 app.py 文件中更新它的路径。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在使用 SQLAlchemy 的 Flask 应用程序中,是否可以将 `session.rollback` 永久放在应用程序的开头?

来自分类Dev

Flask和SQLAlchemy,应用程序未在实例上注册

来自分类Dev

如何从flask_sqlalchemy应用程序执行存储过程

来自分类Dev

Flask应用程序中更智能的sqlalchemy wtf动态过滤器

来自分类Dev

为什么在Flask应用程序开发中必须在PostgreSQL中使用SQLAlchemy?

来自分类Dev

带有sqlalchemy的Flask应用程序尝试使用Flask-APScheduler计划作业

来自分类Dev

SQLAlchemy删除不级联

来自分类Dev

SQLAlchemy关系级联删除

来自分类Dev

如何在Flask-SQLAlchemy中按ID删除记录

来自分类Dev

使用Flask从HTML表中删除单个SQLAlchemy行

来自分类Dev

在flask-sqlalchemy中插入,删除等之前执行任务

来自分类Dev

Flask sqlalchemy-最小应用

来自分类Dev

Flask sqlalchemy-最小应用

来自分类Dev

SqlAlchemy Flask中的列参数

来自分类Dev

SqlAlchemy Flask中的列参数

来自分类Dev

Flask-SqlAlchemy中的继承

来自分类Dev

如何在不使用 SQLAlchemy 的情况下将 Flask 应用程序部署到 Heroku?

来自分类Dev

Flask SQLAlchemy多对多删除元素

来自分类Dev

在Flask中重用应用程序对象

来自分类Dev

Flask 应用程序中的内存数据

来自分类Dev

sqlalchemy的Flask应用上下文

来自分类Dev

使用Flask-sqlalchemy,无需运行应用程序即可将模型连接到数据库

来自分类Dev

如何在 python flask sqlalchemy marshmallow 应用程序中将一个属性对象数组渲染为平面数组?

来自分类Dev

在Flask-SQLAlchemy中自动提交

来自分类Dev

Flask-SQLAlchemy查询中的结果数

来自分类Dev

在Flask-sqlalchemy中获取排序结果

来自分类Dev

flask sqlalchemy关系中的多个外键

来自分类Dev

层次结构中的Flask SQLAlchemy查询

来自分类Dev

渲染存储在 Database Flask SQLAlchemy 中的 HTML

Related 相关文章

  1. 1

    在使用 SQLAlchemy 的 Flask 应用程序中,是否可以将 `session.rollback` 永久放在应用程序的开头?

  2. 2

    Flask和SQLAlchemy,应用程序未在实例上注册

  3. 3

    如何从flask_sqlalchemy应用程序执行存储过程

  4. 4

    Flask应用程序中更智能的sqlalchemy wtf动态过滤器

  5. 5

    为什么在Flask应用程序开发中必须在PostgreSQL中使用SQLAlchemy?

  6. 6

    带有sqlalchemy的Flask应用程序尝试使用Flask-APScheduler计划作业

  7. 7

    SQLAlchemy删除不级联

  8. 8

    SQLAlchemy关系级联删除

  9. 9

    如何在Flask-SQLAlchemy中按ID删除记录

  10. 10

    使用Flask从HTML表中删除单个SQLAlchemy行

  11. 11

    在flask-sqlalchemy中插入,删除等之前执行任务

  12. 12

    Flask sqlalchemy-最小应用

  13. 13

    Flask sqlalchemy-最小应用

  14. 14

    SqlAlchemy Flask中的列参数

  15. 15

    SqlAlchemy Flask中的列参数

  16. 16

    Flask-SqlAlchemy中的继承

  17. 17

    如何在不使用 SQLAlchemy 的情况下将 Flask 应用程序部署到 Heroku?

  18. 18

    Flask SQLAlchemy多对多删除元素

  19. 19

    在Flask中重用应用程序对象

  20. 20

    Flask 应用程序中的内存数据

  21. 21

    sqlalchemy的Flask应用上下文

  22. 22

    使用Flask-sqlalchemy,无需运行应用程序即可将模型连接到数据库

  23. 23

    如何在 python flask sqlalchemy marshmallow 应用程序中将一个属性对象数组渲染为平面数组?

  24. 24

    在Flask-SQLAlchemy中自动提交

  25. 25

    Flask-SQLAlchemy查询中的结果数

  26. 26

    在Flask-sqlalchemy中获取排序结果

  27. 27

    flask sqlalchemy关系中的多个外键

  28. 28

    层次结构中的Flask SQLAlchemy查询

  29. 29

    渲染存储在 Database Flask SQLAlchemy 中的 HTML

热门标签

归档