gpt4 book ai didi

python - sqlalchemy动态构建or_合取and_

转载 作者:行者123 更新时间:2023-12-01 04:13:52 27 4
gpt4 key购买 nike

我正在尝试生成与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com