【发布时间】:2013-10-10 16:40:22
【问题描述】:
我使用flask-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 中的错误级别?我认为我的项目正在悄然失败,我想证实我的猜测。
更新:
我使用了错误的常量字典。一个字典包含整数,另一个包含字符串(一个用于数据库查询,一个用于打印)。
_post_status = db.Column(
db.SmallInteger,
default=Consts.post_status["Draft"])
post_status 包含整数,Consts.PostStatuses 包含字符串。事后看来,真是个坏主意。我将制作一个返回元组而不是两个字典的字典。
@property
def post_status(self):
return Consts.post_status.get(getattr(self, "_post_status", None))
【问题讨论】:
-
Post.post_status 和 Consts.PostStatuses["Draft"] 是什么类型? Post是模特吗? SqlAlchemy 基于类型和 python 魔术方法构建查询。我可以肯定地告诉你,如果 post_status 是布尔值并且草稿是空字符串,sqlalchemy 将生成一个始终为真的 sql 语句。肯定还有其他情况。
-
post_status 是一个小整数,PostStatuses 是一个整数(在本例中为 1)。
-
你能更精确一点吗?在运行查询之前添加
print type(Post.post_status), type(Const.PostStatuses["Draft"])。它应该打印类似<class 'sqlalchemy.orm.attributes.InstrumentedAttribute'> int -
不确定如果双方都是 int 类型,您期望如何获得
"Post".post_status != "Draft"。我必须假设您有一个错误输入的比较,它的评估结果总是正确的。请按照 deque 的说明向我们提供更多信息。 -
所以
Type(Post.post_status)是<type 'property'>和Const.PostStatuses["Draft"]是<type 'str'>。我忘记了我有两个状态常量字典。一个包含字符串,一个包含整数。我用的是包含字符串的那个。
标签: python sqlalchemy flask-sqlalchemy