如何在Python if语句中使用PostgreSQL布尔值作为参数
解决PostgreSQL查询布尔值在Python中判断的问题
问题根源
你用fetchall()得到的[(True,)]是包含单个元组的列表,元组的第一个元素才是你要的布尔值is_draft。之前直接拿整个列表或字符串去和True比较,自然匹配不上。
优化方案(推荐)
改用fetchone()直接获取单行数据,同时修复SQL注入风险(不要用字符串拼接SQL):
cur = conn.cursor() # 用参数化查询,%s是psycopg2的占位符,item_id会被安全转义 cur.execute("SELECT is_draft FROM item_pool WHERE item_id = %s", (item_id,)) # 提取元组中的布尔值 is_draft = cur.fetchone()[0] conn.close() return is_draft
之后直接用if is_draft:就能正常判断:
result = your_function(item_id) if result: print("是草稿状态") else: print("非草稿状态")
如果你坚持用fetchall()
需要先判断列表非空,再提取元组内的布尔值:
cur = conn.cursor() cur.execute("SELECT is_draft FROM item_pool WHERE item_id = %s", (item_id,)) list_of_tuples = cur.fetchall() conn.close() # 处理结果 if list_of_tuples: # 确保有查询结果 is_draft = list_of_tuples[0][0] if is_draft: # 执行你的逻辑 pass
关键提醒
绝对不要用字符串拼接的方式构造SQL语句(比如"WHERE item_id = " + str(item_id)),这会导致严重的SQL注入漏洞,恶意用户可以通过构造特殊的item_id删除你的数据库表或窃取数据。
内容的提问来源于stack exchange,提问作者Ray Babich
相关产品推荐
相关产品推荐

