You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pinotdb连接Apache Pinot时出现AttributeError如何解决?

问题

本地通过Docker运行Apache Pinot的步骤:

docker pull apachepinot/pinot:latest

docker run -p 9000:9000 pinot:latest QuickStart -type batch

使用Python的pinotdb包连接查询时,遇到以下错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [31], in <cell line: 1>()
----> 1 curs.execute("""
      2     SELECT * 
      3     FROM baseballStats
      4     WHERE league IN (%(leagues)s)
      5     """, {"leagues": ["AA", "NL"]})
      6 for row in curs:
      7     print(row)

File ~\Anaconda3\envs\pinotdb\lib\site-packages\pinotdb\db.py:56, in check_closed.<locals>.g(self, *args, **kwargs)
     54 if self.closed:
     55     raise exceptions.Error(f"{self.__class__.__name__} already closed")
---> 56 return f(self, *args, **kwargs)

File ~\Anaconda3\envs\pinotdb\lib\site-packages\pinotdb\db.py:448, in Cursor.execute(self, operation, parameters)
    441 @check_closed
    442 def execute(self, operation, parameters=None):
    443     query = self.finalize_query_payload(operation, parameters)
    445     r = self.session.post(
    446         self.url,
    447         json=query,
---> 448         auth=(self.auth._username, self.auth._password))
    449     return self.normalize_query_response(query, r)

AttributeError: 'NoneType' object has no attribute '_username'

使用的Python代码:

from pinotdb import connect

conn = connect(host='localhost', port=8000, path='/query/sql', scheme='http')
curs = conn.cursor()

curs.execute("""
    SELECT * 
    FROM baseballStats
    WHERE league IN (%(leagues)s)
    """, {"leagues": ["AA", "NL"]})
for row in curs:
    print(row)

解决方法

  • 修正端口配置:Docker映射的是9000端口,但代码里连接的是8000,Pinot默认SQL查询端口为9000,先把代码中的port=8000改成port=9000。
  • 处理认证逻辑bug:错误是因为pinotdb在无认证场景下未正确处理auth为None的情况,有两种修复方式:
    1. 显式传入auth=None参数,强制跳过认证:
      conn = connect(host='localhost', port=9000, path='/query/sql', scheme='http', auth=None)
      
    2. 传入空的认证对象:
      from pinotdb import connect, Auth
      conn = connect(host='localhost', port=9000, path='/query/sql', scheme='http', auth=Auth('', ''))
      
  • 验证服务可用性:可以访问http://localhost:9000/query/sql确认Pinot的SQL查询端点是否正常响应。

内容的提问来源于stack exchange,提问作者Minura Punchihewa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:15:59