【问题标题】:Why do I get pyodbc HY000 error if I commit() after complex SELECT in Vertica?如果在 Vertica 中进行复杂的 SELECT 后提交(),为什么会出现 pyodbc HY000 错误?
【发布时间】:2014-02-03 18:06:10
【问题描述】:

我已经追了一个星期这个错误:

pyodbc.Error: ('HY000', '[HY000] [Vertica][VerticaDSII] (20) An error occurred during query execution:  (20) (SQLFetch)')

经过大量试验和错误,关键是结合这个特定的SELECT 查询(更简单的不会出错)加上在curs.execute() 之后调用commit()。我真的很想听听你的想法。下面(后跟配置信息)是示例。任何有助于理解为什么会发生这种情况的帮助将不胜感激。如果有帮助,我很乐意提供更多详细信息。

版本:

  • Linux 上的 Python:3.3.2 [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)]
  • pyodbc: 3.0.7 (pyodbc.SQL_DBMS_VER: 18, pyodbc.SQL_DM_VER: 171, pyodbc.SQL_DRIVER_ODBC_VER: 77, pyodbc.SQL_DRIVER_VER: 7, pyodbc.SQL_ODBC_VER: 10)
  • unixODBC:2.2.14
  • vertica:Vertica 分析数据库 v7.0.0-0
  • 操作系统:Linux 版本 2.6.32-279.14.1.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) )

来源:

import pyodbc

query = '''
SELECT relVarTable0.id AS id, relVarTable1.val, relVarTable2.val, relVarTable3.val, relVarTable4.val
FROM (SELECT id FROM B) relVarTable0
LEFT JOIN
(SELECT B1.id AS id, AVG(A1.X) AS val
FROM B B1, AB AB1, A A1
WHERE B1.id = AB1.B_id AND A1.id = AB1.A_id AND A1.X IS NOT NULL
GROUP BY B1.id) relVarTable1
    ON relVarTable0.id = relVarTable1.id
LEFT JOIN
(SELECT B1.id AS id, B1.Y AS val
FROM B B1
WHERE B1.Y IS NOT NULL ) relVarTable2
    ON relVarTable0.id = relVarTable2.id
LEFT JOIN
(SELECT B1.id AS id, AVG(A1.W) AS val
FROM B B1, AB AB1, A A1
WHERE B1.id = AB1.B_id AND A1.id = AB1.A_id AND A1.W IS NOT NULL
GROUP BY B1.id) relVarTable3
    ON relVarTable0.id = relVarTable3.id
LEFT JOIN
(SELECT B1.id AS id, AVG(C1.Z) AS val
FROM B B1, BC BC1, C C1
WHERE B1.id = BC1.B_id AND C1.id = BC1.C_id AND C1.Z IS NOT NULL
GROUP BY B1.id) relVarTable4
    ON relVarTable0.id = relVarTable4.id;
'''

conn = pyodbc.connect('DSN=vertica_kdl_dsn;UserName=__;Password=__)
curs = conn.cursor()
curs.execute('SET search_path TO "$user", rcd_test, public, v_catalog, v_monitor, v_internal;')
curs.execute(query)
curs.commit()           # comment out to get no error
rows = curs.fetchall()  # if above commit called: pyodbc.Error: ('HY000', '[HY000] [Vertica][VerticaDSII] (20) An error occurred during query execution:  (20) (SQLFetch)')
curs.close()

【问题讨论】:

  • 您能否在dc_errors 中查找与您的查询相关的错误并发布EXPLAIN VERBOSE 输出?
  • 为什么你在执行后commit?为什么不先fetchall 然后commit
  • @FreshPrinceOfSO 我可以看到 dc_errors 中没有错误。 (问:可以从该表中删除 * 吗?) EXPLAIN VERBOSE 输出位于 gist.github.com/anonymous/8806750#file-gistfile1-sql 。谢谢!
  • @Brad 这是一个很好的问题,也是一个很好的解决方法 - 非常感谢。我围绕 dbapi2 编写了一个包装器,它处理 postgres、mysql、sqlite3,现在(几乎!)vertica。它有一个execute(),负责处理commit()(避免postgres和vertica挂起)和异常时的rollback()(避免mysql死锁)。我会玩它...

标签: sql pyodbc vertica


【解决方案1】:

仅供参考,我在Vertica community forum 找到了一个简单的解决方案:

在DSN下的odbc.ini中添加ResultBufferSize=0 [vertica_kdl_dsn] 部分

(Hy000 并不是一个特别有用的错误消息!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2016-01-18
    • 2014-09-09
    • 2022-01-09
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多