【问题标题】:Psycopg2 Python Inserting ListPsycopg2 Python 插入列表
【发布时间】:2016-06-09 20:21:44
【问题描述】:

我正在尝试通过 psycopg2 将一个列表插入到 SQL 查询中,但每次它看到的是一个 ' ,它就会加倍......

代码如下:

for Line in ListFile:
    if CountLigne == 1:
        IDList = "'" + (Line[1].replace('"', '')) + "', "
        CountLigne += 1
    elif CountLigne < NbrLigne:
        IDList += "'" + (Line[1].replace('"', '')) + "', "
        CountLigne += 1
    else:
        IDList += (Line[1].replace('"', '') + "'")

    break
print(IDList)
print(type(IDList))
FTDSQL = (
'''WITH ftd AS (
    SELECT m.event_user, m.event_ts, m.revenue, rank() OVER (PARTITION BY            m.event_user ORDER BY m.event_ts) as order_purchase
    FROM agg_monetization m
    WHERE revenue is not null
)
SELECT distinct ftd.event_user, SUM(ftd.revenue)
FROM ftd
WHERE order_purchase = 1
AND ftd.event_user IN (%s)
GROUP BY ftd.event_user, ftd.event_ts
'''
)
Cursor.execute(FTDSQL, [IDList])
print(Cursor.query)

列表:'849cf768-41ea-4ed0-9861-779369d3eede'、'10ad8dca-b4e6-4be5-93d3-b7fb88b1668a'

结果:AND ftd.event_user IN ('''849cf768-41ea-4ed0-9861-779369d3eede'', ''10ad8dca-b4e6-4be5-93d3-b7fb88b1668a'', ''863c3eaf-d98d-4f6a-bb97 -8756750e7a09''

谢谢!!

【问题讨论】:

  • 但是这个列表有 2964 长并且每次我查询都会改变.. 我该如何解决这个问题?

标签: python sql postgresql psycopg2


【解决方案1】:

Pyscopg2 自动将元组转换为 sql 列表。看看Adaptation of Python values to SQL types。因此,您只需将列表更改为元组,然后传递它。

FTDSQL = '''
  WITH ftd AS (
    SELECT 
      m.event_user, m.event_ts, m.revenue, 
      rank() OVER (PARTITION BY m.event_user ORDER BY m.event_ts) as order_purchase
    FROM agg_monetization m
    WHERE revenue is not null
  )
  SELECT
    distinct ftd.event_user, SUM(ftd.revenue)
  FROM ftd
  WHERE
    order_purchase = 1
  AND
    ftd.event_user IN %s
    -- parenthesis should be added automatically 
  GROUP BY ftd.event_user, ftd.event_ts
'''
)
Cursor.execute(FTDSQL, (tuple(IDList),))

另一方面,Python 列表默认转换为 postgres 数组

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2012-04-11
    • 2015-06-10
    • 2016-10-21
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多