【问题标题】:Prestodb + Python: Using a List as Query ArgumentPrestodb + Python:使用列表作为查询参数
【发布时间】:2022-01-01 07:42:43
【问题描述】:

我正在尝试在 Python 中使用 prestodb 并在查询中将数字列表作为参数传递,它给出了这个错误:

PrestoUserError: PrestoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 208:33: IN value and list items must be the same type: bigint", query_id=20211122_175131_24052_rruhu)

代码类似这样:

import prestodb 
from prestodb import dbapi 
import os 

conn=prestodb.dbapi.connect(
    host=os.environ['aa'],
    port=os.environ['bb'],
    user=os.environ['cc'],
    password=os.environ['dd'],
    catalog='hive'
)

date_start = '2021-10-10'
date_end = '2021-10-15'
list_id = (1,2,3,4)

sql = '''
SELECT
   * 
FROM
   table
WHERE
   DATE BETWEEN '{date_start}'
   AND '{date_end}'
   AND ID in ({list_id})
   '''.format(date_start=date_start,date_end=date_end,list_id=list_id)

   cur = conn.cursor()

   cur.execute(sql)
   query_result = cur.fetchall()

【问题讨论】:

  • 如果答案适合您,请将其标记为accepted one(答案旁边的复选标记)。

标签: python presto


【解决方案1】:

format 不会正确加入list_id。尝试使用 ','.join(map(str, list_id)) 将 id 组合成逗号分隔的字符串:

sql = '''
SELECT
   * 
FROM
   table
WHERE
   DATE BETWEEN '{date_start}'
   AND '{date_end}'
   AND ID in ({list_id})
   '''.format(date_start=date_start,date_end=date_end,list_id=','.join(map(str, list_id)))

UPD

或者,如 @Tomerikoo 所建议的那样 - 只需 str(list_id) 并从格式中删除多余的括号:

sql = '''
SELECT
   * 
FROM
   table
WHERE
   DATE BETWEEN '{date_start}'
   AND '{date_end}'
   AND ID in {list_id}
   '''.format(date_start=date_start,date_end=date_end,list_id=str(list_id))

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2020-10-06
    • 2019-01-02
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多