- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试生成与 or_ 和 and_ 的动态连接,但 SQL 查询不会生成 or。
每个查询的运算符 or_ 和 and_ 数量各不相同。
查询:
q = se.query(Publicacion.update_time).join(Categoria).order_by(Publicacion.update_time.desc())
q = q.filter(and_(Publicacion.id_group_id == '103738479786979'))
q = q.filter(and_(Publicacion.id_categoria_id == 1),)
q = q.filter(and_(Categoria.estatus == True),)
q = q.filter(or_(Publicacion.message.ilike('%Obsequios%')),)
q = q.filter(or_(Publicacion.message.ilike('%jose%')))
q = q.filter(or_(Publicacion.message.ilike('%compu%')))
输出sql:
SELECT showgroups_publicacion.update_time AS showgroups_publicacion_update_time
FROM showgroups_publicacion JOIN showgroups_categoria ON showgroups_categoria.id = showgroups_publicacion.id_categoria_id
WHERE showgroups_publicacion.id_group_id = %(id_group_id_1)s AND showgroups_publicacion.id_categoria_id = %(id_categoria_id_1)s AND showgroups_categoria.estatus = true AND showgroups_publicacion.message ILIKE %(message_1)s AND showgroups_publicacion.message ILIKE %(message_2)s AND showgroups_publicacion.message ILIKE %(message_3)s ORDER BY showgroups_publicacion.update_time DESC
最后我是这样解决的,如果有更优雅的,分享一下:
Y = and_ (column1 == 1)
Y = and_ (column2 == 'SQL',Y)
O = or_ (column1 == 2)
O = or_ (column2 == 'Python',O)
session.query(Model).filter(or_(O,Y))
最佳答案
您误解了 or_
、and_
和 filter
的使用。 Look at the tutorial for a correct example .
您应该在 and_
(和 or_
)内指定多个子句,就像在每种编程语言中所做的那样。而不是这样写:
q = q.filter(and_(Publicacion.id_group_id == '103738479786979'))
q = q.filter(and_(Publicacion.id_categoria_id == 1),)
q = q.filter(and_(Categoria.estatus == True),)
你应该这样写:
q = q.filter(and_(
Publicacion.id_group_id == '103738479786979',
Publicacion.id_categoria_id == 1,
Categoria.estatus == True,
))
对于 or_
也是如此。
现在我不知道您的想法,所以我无法告诉您在您的情况下应如何组合两个 and_
和 or_
子句。 可能您想这样做:
q = q.filter(
Publicacion.id_group_id == '103738479786979',
Publicacion.id_categoria_id == 1,
Categoria.estatus == True,
or_(
Publicacion.message.ilike('%Obsequios%'),
Publicacion.message.ilike('%jose%'),
Publicacion.message.ilike('%compu%'),
),
)
<小时/>
通过使用带有单条件子句的多个过滤器
,您所做的基本上是这样的:
and_
/or_
是多余的,因此 filter(and_(something))
相当于 filter(or_(something))
,相当于 filter(something)
。您发出了多个过滤器
,这些过滤器只能合并为一个。您的代码 100% 相当于:
q = q.filter(
Publicacion.id_group_id == '103738479786979',
Publicacion.id_categoria_id == 1,
Categoria.estatus == True,
Publicacion.message.ilike('%Obsequios%'),
Publicacion.message.ilike('%jose%'),
Publicacion.message.ilike('%compu%'),
)
filter()
的行为是对每个条件进行AND
。事实上,您的查询仅包含 AND
。
顺便说一下,请注意 filter(and_(a, b, c, ...))
相当于 filter(a, b, c, ...)
.
关于python - sqlalchemy动态构建or_合取and_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554948/
我以前使用过像 Netbeans 和 eclipse 这样的 IDE。 我在 friend 的电脑上下载了“Visual Studio Express 2013 for windows desktop
我正在尝试弄清楚如何在 GBA 大小的 EZ Flash 3 合 1 卡中对 PSRAM 进行编程。基本上重复 GBA Exploader 和其他程序所做的事情。 如果我选择一个 block 并对其进
Filter1=re.findall(r'',PageSource) Filter2=re.findall(r'',PageSource) Filter3=re.findall(r'(.*?).*?'
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是一名优秀的程序员,十分优秀!