5

テーブルからエントリを削除しようとしています。これは、削除機能の私のコードです。

@app.route("/delete_link/<link_id>", methods=['GET', 'POST'])
def delete_link(link_id):
    link = models.Link.query.filter(models.Link.l_id == link_id).first()
    db.session.delete(link)
    db.session.commit()
    return flask.redirect(flask.url_for('links'))

行:db.session.delete(link)このエラーを返します:

InvalidRequestError: オブジェクト '' は既にセッション '1' にアタッチされています (これは '2' です)

私もこのコードを試しました:

@app.route("/delete_link/<link_id>", methods=['GET', 'POST'])
def delete_link(link_id):
    link = models.Link.query.filter(models.Link.l_id == link_id)
    link.delete()
    db.session.commit()
    return flask.redirect(flask.url_for('links'))

データベースを更新しません。リンクは私が推測するセッションにある必要はありませんが、それを確認する方法と修正する方法がわかりません。私はsqlalchemyが初めてです。

編集

これを使用して、おそらくこの段階でセッションを作成する db 変数を作成します (これはコードの上部にあります)。それはフラスコのドキュメントから来ています

from yourapplication import db
4

2 に答える 2

1

http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profilingで説明されている問題と同様の問題のよう です。詳細な説明です。問題と彼がそれをどのように解決したかについて。その記事の著者は、フォークとして利用できる修正を行いました。

修正

この問題に対処するには、Flask-WhooshAlchemy のクエリ オブジェクトをモデルに追加する別の方法を見つける必要があります。

Flask-SQLAlchemy のドキュメントには、クエリに使用するクラスを含む model.query_class 属性があると記載されています。これは実際には、Flask-WhooshAlchemy が行っている方法よりも、Flask-SQLAlchemy にカスタム クエリ クラスを使用させるためのはるかにクリーンな方法です。Whoosh 対応のクエリ クラス (既に Flask-SQLAlchemy の BaseQuery のサブクラスです) を使用してクエリを作成するように Flask-SQLAlchemy を構成すると、以前と同じ結果になりますが、バグはありません。

これらの変更を実装した github で Flask-WhooshAlchemy プロジェクトのフォークを作成しました。変更を確認したい場合は、私のコミットの github diff を確認するか、修正された拡張機能をダウンロードして、元のflask_whooshalchemy.py ファイルの代わりにインストールすることもできます。

于 2013-06-20T20:53:28.817 に答える