私はフラスコ sqlalchemy を使用してこのステートメントを作成しましたが、元の形式のままにしておくことにしました。Post.query
と同等ですsession.query(Post)
下書き状態にあり、現在のユーザーによって作成または変更されていない、データベース内のすべての投稿を除外するサブクエリを作成しようとしました。このクエリを作成しましたが、
Post.query\
.filter(sqlalchemy.and_(
Post.post_status != Consts.PostStatuses["Draft"],
sqlalchemy.or_(
Post.modified_by_id == current_user.get_id(),
Post.created_by_id == current_user.get_id()))
作成したもの:
Where true AND ("Post".modified_by_id = :modified_by_id_1 OR
"Post".created_by_id = :created_by_id_1)
期待される結果:
Where "Post".post_status != "Draft" AND (
"Post".modified_by_id = :modified_by_id_1 OR
"Post".created_by_id = :created_by_id_1)
私は疑問に思っています、なぜこれが起こっているのですか?SQLAlchemy のエラー レベルを上げるにはどうすればよいですか? 私のプロジェクトは静かに失敗していると思います。私の推測を確認したいと思います。
アップデート:
間違った定数辞書を使用しました。1 つのディクショナリには int が含まれ、もう 1 つのディクショナリには文字列が含まれます (1 つはデータベース クエリ用、もう 1 つは印刷用)。
_post_status = db.Column(
db.SmallInteger,
default=Consts.post_status["Draft"])
post_status には整数が含まれ、Consts.PostStatuses には文字列が含まれます。後から考えると、本当に悪い考えです。2 つの辞書ではなく、タプルを返す単一の辞書を作成します。
@property
def post_status(self):
return Consts.post_status.get(getattr(self, "_post_status", None))