【问题标题】:Passing a Python Variable To an "IN" of Postgresql将 Python 变量传递给 Postgresql 的“IN”
【发布时间】:2022-01-20 15:30:13
【问题描述】:

希望你们今天做得很好,

我有一个 python 脚本,它从stock_picking 表中提取name

self.env.cr.execute("SELECT name FROM stock_picking WHERE sale_id = %s", [pulled_so_id])
raw_pick = self.env.cr.fetchall()

执行时,上面的查询运行良好并显示这三个名称的结果:

[('WH/OUT/00013',), ('WH/OUT/00011',), ('WH/OUT/00012',)]

我将这三个结果转换为字符串,删除了几个不需要的字符,并将其中的三个分配给一个变量。长话短说,它变成了这样:

pulled_picking_name = str(raw_pick5)

#  In my terminal, a variable above now contains clean result of :
#  'WH/OUT/00013','WH/OUT/00011','WH/OUT/00012'

现在,我想将这个 pulled_picking_name 放入我的同一 python 脚本中的 UPDATE 查询中:


 self.env.cr.execute("UPDATE account_move SET partner_id = %s WHERE ref IN (%s)",
                                [pulled_partner_id, pulled_picking_name])

然后什么都没有发生。

我用我自己声明的字符串填充了IN (%s),它运行良好。我还使用上面的UPDATE 查询直接将这三个结果测试到psql,它也很有效。

但是当我将这三个结果分配给变量并将其传递给我的查询时,什么都没有发生。没有错误信息或任何东西。

我觉得我错过了什么,但我可以弄清楚它是什么:(

拜托,每一个帮助都非常感谢!

【问题讨论】:

    标签: python postgresql


    【解决方案1】:

    您绝对不需要“转换为字符串并删除不需要的字符”。你得到了什么

    raw_pick = self.env.cr.fetchall()
    # [('WH/OUT/00013',), ('WH/OUT/00011',), ('WH/OUT/00012',)]
    

    是行元组的列表;由于结果集的每一行都有一列,因此您会得到 1 元组。

    如果你想要一个普通的字符串数组(或任何第一列的数据类型),请执行

    raw_pick = [row[0] for row in self.env.cr.fetchall()]
    # ['WH/OUT/00013', 'WH/OUT/00011', 'WH/OUT/00012']
    

    要使用in,您需要将一个元组传递给 Postgres 适配器。假设您想对所有这些 raw_pick 字符串做点什么,

    names = tuple(raw_pick)
    self.env.cr.execute(
        "UPDATE account_move SET partner_id = %s WHERE ref IN %s",
        [pulled_partner_id, tuple(raw_pick)],
    )
    

    成功了。

    【讨论】:

    • 您不必转换为元组,只需保留为列表并将ref IN %s 更改为ref = ANY(%s)List adaptation。额外的好处是,如果列表为空,它不会出错,而空元组和 IN 会。
    • @AdrianKlaver 好点。根据tuple adaptation,我习惯于使用带有IN 的元组。 :)
    【解决方案2】:

    更重要的是,恕我直言,您到底为什么要在一些 Python 代码中前后拖拽数据?

    UPDATE account_move SET partner_id = %s WHERE ref IN (
      SELECT name FROM stock_picking WHERE sale_id = %s
    );
    

    还有其他方法可以编写该查询,但这只是将两个部分粘在一起。

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 2012-10-18
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2013-11-02
      相关资源
      最近更新 更多