Prestodb + Python:使用列表作为查询参数

Posted

技术标签:

【中文标题】Prestodb + Python:使用列表作为查询参数【英文标题】:Prestodb + Python: Using a List as Query Argument 【发布时间】: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(答案旁边的复选标记)。 【参考方案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))

【讨论】:

以上是关于Prestodb + Python:使用列表作为查询参数的主要内容,如果未能解决你的问题,请参考以下文章

python-9-列表的增删改查

Python的列表类型操作——“增删改查”,元组——“查”

python 数据类型---列表使用 之二 (增删改查)

Leetcode刷题--知识点查漏补缺

Python数据类型-列表(list)增删改查

PrestoDB EMR 服务器拒绝连接