Улей odbc с подготовленными утверждениями: ParseException - PullRequest
0 голосов
/ 28 января 2019

Контекст: Hive3, HDP 3.1.Тесты, выполненные с помощью Python / odbc (официальный драйвер HDP) в Windows и Linux.

Я выполнил следующие запросы:

  1. "выбрать? Как лицензию,? Как cpg"
  2. "выберите * из (выберите? Как лицензия,? Как cpg) как t"
  3. "с init как (выберите? Как лицензия,? Как cpg), выберите * из init",

1) и 2) работают нормально, и дают мне ожидаемый результат.3 дает мне ParseException:

Ошибка при компиляции оператора: FAILED: ParseException строка 1:21 не может распознать ввод около '?''as' 'lic' в операторе select (80) (SQLPrepare) ")

Точно такие же операторы, работающие с java / jdbc, работают нормально. Обратите внимание, что 2) выглядит как обходной путь для 3)но он работает для этого крошечного примера, а не для больших запросов.

Есть ли что-то, что я могу сделать, чтобы ODBC работал должным образом? Кроме того, где я могу найти ограничения драйвера ODBC?

Для полного контекста полный тестовый код выглядит следующим образом:

cnxnstr = 'DSN=HiveProd'
cnxn = pyodbc.connect(cnxnstr, autocommit=True)

cursor = cnxn.cursor()
queries = [ 
    "with init as (select ? as lic, ? as cpg) select * from init", 
    "select 2 * ? as lic, ? as cpg", 
    "select * from (select ? as lic, ? as cpg) as t", 
]

for q in queries:
    print("\nExecuting " + q)
    try:
        cursor.execute(q, '1', '2')
    except pyodbc.ProgrammingError as e:
        print(e)
        continue

1 Ответ

0 голосов
/ 18 февраля 2019

Короче говоря, у драйвера Hive ODBC много проблем.Одним из них является то, что при любой ошибке он отправляет запрос «как есть» в куст, который будет жаловаться на первый знак вопроса, который он найдет, независимо от того, что является реальной проблемой.

Если в драйвере odbc включено ведение журнала, может быть обнаружена реальная проблема (а их много).

...