【问题标题】:Flask SQLAlchemy - ondelete='CASCADE' not deleting "POSTS" of a "USER". (Using SQLite database)Flask SQLAlchemy - ondelete='CASCADE' 不删除“USER”的“POSTS”。 (使用 SQLite 数据库)
【发布时间】:2020-07-28 20:23:36
【问题描述】:

这是我的桌子。我正在使用 SQLite 数据库。

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    username = db.Column(db.String(30), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    date_joined = db.Column(db.DateTime, nullable=False,
                            default=datetime.utcnow)
    posts = db.relationship('Post', backref='author',
                            lazy=True, passive_deletes=True)

    def __repr__(self):
        return f"User('{self.email}', '{self.username}', '{self.date_joined}')"


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    body = db.Column(db.Text, nullable=False)
    link = db.Column(db.String(300))
    date_posted = db.Column(db.DateTime, nullable=False,
                            default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey(
        'user.id', ondelete='CASCADE'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}', '{self.body}', '{self.link}', '{self.date_posted}')"

这是“USER”路由的删除,它会删除用户但不会删除用户创建的帖子。

@login_required
@app.route('/delete/account', methods=['GET', 'POST'])
def delete_account():
    if current_user.is_authenticated:
        db.session.query(User).filter_by(id=current_user.id).delete()
        db.session.commit()
        flash('Your account has been deleted!', 'success')
        return redirect(url_for('home'))
    return render_template('settings.html', title='Account Settings')

【问题讨论】:

    标签: python database sqlite flask flask-sqlalchemy


    【解决方案1】:

    SQLite3 需要一些哄骗来强制执行外键。你基本上需要执行

    PRAGMA foreign_keys=ON
    

    在每个新连接上。我做了类似以下的事情

    db = SQLAlchemy()
    app = Flask(__name__)
    ... configure app
    db.init_app(app)
    if app.config['SQLALCHEMY_DATABASE_URI'].startswith('sqlite'):
        from sqlalchemy import event  # noqa
        from sqlalchemy.engine import Engine  #noqa
    
        @event.listens_for(Engine, "connect")
        def _sqlite_fk_pragma(dbapi_connection, connection_record):
            cursor = dbapi_connection.cursor()
            cursor.execute("PRAGMA foreign_keys=ON;")
            cursor.close()
    

    This gist 提供了一个变体。

    【讨论】:

      【解决方案2】:

      您需要单独查询才能删除帖子。

      db.session.query(Post).filter(Post.user_id == current_user.id).delete()

      【讨论】:

        【解决方案3】:

        您可以在您的用户模型中使用属性cascade 来实现:

        posts = db.relationship('Post', backref='author',
                                    lazy=True, cascade='delete')
        

        【讨论】:

          猜你喜欢
          • 2017-07-26
          • 1970-01-01
          • 2023-03-17
          • 2015-02-12
          • 2015-11-17
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          • 2015-03-25
          相关资源
          最近更新 更多