Запрос работает нормально в браузере запросов, но не в коде Python

У меня есть запрос teradata sql, который отлично работает в браузере запросов Teradata Studio Express, но когда я попытался запустить тот же запрос в моем коде python, я получаю следующую ошибку:

(3706, "[42000] [Teradata][ODBC Teradata Driver]Teradata DatabaseSyntax error: expected something between '(' and '('.")

Мой запрос:

td_query = """select 
hash_md5((XMLAGG(TRIM(h_age) ORDER BY h_age ASC) (VARCHAR(100))) )hash_age,
hash_md5((XMLAGG(TRIM(h_marks) ORDER BY h_age ASC )(VARCHAR(100)))) hash_marks,
hash_md5((XMLAGG(TRIM(h_id) ORDER BY h_age ASC )(VARCHAR(100)))) hash_id,
hash_md5((XMLAGG(TRIM(h_score) ORDER BY h_age ASC )(VARCHAR(100))))hash_score,
hash_md5((XMLAGG(TRIM(h_name) ORDER BY h_age ASC )(VARCHAR(100))))hash_name,
hash_md5((XMLAGG(TRIM(h_entry) ORDER BY h_entry ASC )(VARCHAR(100))))hash_entry,
SUM(Aggrownum) sum_val,
COUNT(Aggrownum) count_val,
sum_val/count_val row_num
from 
(
Select 
hash_md5(CAST(age AS VARCHAR(100)))h_age ,
hash_md5(CAST(marks AS VARCHAR(100)))h_marks,
hash_md5(CAST(id AS VARCHAR(100)))h_id,
hash_md5(CAST(score AS VARCHAR(100)))h_score,
hash_md5(CAST(f_name AS VARCHAR(100)))h_name,
hash_md5(CAST(entry AS FORMAT 'yyyy-mm-ddbhh:mi:ss') (char (20)))h_entry,
row_number() over (partition by dob order by  age asc) rno,round(rno/500.0) Aggrownum
from tdwm.student_2
) A group by Aggrownum ORDER BY row_num;
"""

и в файле python он запускается как:

df_teradata = pd.read_sql(td_query, connect)            

Где connect - это объект td.UdaExec, а приведенный выше код отлично работает для других более простых запросов, таких как select * from tdwm.student_2.

Я также пробовал свернутую версию того же запроса. Я получаю ту же ошибку.

Это код, в котором я использую td_query:

import pandas as pd
import teradata as td

td_host, td_username, td_passwd, td_dbname = '10.20.181.55', 'dbac', 'dbac', 'tdwm'

udaExec = td.UdaExec(appName = "test", version = "1.0", logConsole=False)
with udaExec.connect(method = "odbc",system=td_host, username=td_username, port=1025,
                            password=td_passwd, driver = "Teradata Database ODBC Driver 16.20") as connect:
    df_teradata = pd.read_sql(td_query, connect)

попробуйте избежать двойных кавычек (") как это \"

user4321 11.10.2018 16:22

@ user4321, но в запросе нет ". Или ты про \"""select ?

noobie 11.10.2018 16:30

Похоже, что синтаксический анализатор не находит hash_md5 UDF. Отправляющий пользователь может иметь другую базу данных по умолчанию.

dnoeth 11.10.2018 16:35

@dnoeth, могу ли я отправить запрос на сервер teradataне разбирая его сначала в python?

noobie 11.10.2018 16:43

почему у вас есть что-то вроде трех двойных кавычек в строке запроса? Когда вы говорите, что это работает в Teradata Studio, включаете ли вы туда все эти двойные кавычки?

Andrew 11.10.2018 16:55

@Andrew Нет, я не включаю эти """ при выполнении там запроса. Даже если я дам один " вместо трех, проблема не исчезнет.

noobie 11.10.2018 16:57

Я предлагаю распечатать вашу переменную td_query на python. Скопируйте это, посмотрите, работает ли он в TD Studio.

Andrew 11.10.2018 17:00

@Andrew ... тройная двойная кавычка - это многострочная строка Python или комментарий. Эти кавычки не появляются внутри строки.

Parfait 11.10.2018 17:00

@Parfait добавил соответствующий код, пожалуйста, проверьте

noobie 11.10.2018 17:37

Что такое td? Пожалуйста, включите строки import. А вы проверяли точный запрос в Studio Express с пользователем dbac на сервере 10.20.181.55? И проверьте, в какой db / schema существует сохраненная функция hash_mdf5() и есть ли у dbac доступ к ней.

Parfait 11.10.2018 17:52

@Parfait Я опубликовал обновленный код, и да, этот запрос работает со Studio Express с пользователем dbac на сервере по адресу 10.20.181.55

noobie 12.10.2018 08:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
483
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я столкнулся с подобной проблемой ..

Проблема с вашим запросом заключается в том, что он содержит функцию hash_md5, которая неизвестна teradata python module, поэтому ошибка.

Решение:

Добавьте имя базы данных перед этой функцией (как вы делали перед именем таблицы tdwm.student_2). Итак, ваш новый запрос будет:

select 
 tdwm.hash_md5((XMLAGG(TRIM(h_age) ORDER BY h_age ASC) (VARCHAR(100))) )hash_age,
 tdwm.hash_md5((XMLAGG(TRIM(h_marks) ORDER BY h_age ASC )(VARCHAR(100)))) hash_marks,
 tdwm.hash_md5((XMLAGG(TRIM(h_id) ORDER BY h_age ASC )(VARCHAR(100)))) hash_id,
 tdwm.hash_md5((XMLAGG(TRIM(h_score) ORDER BY h_age ASC )(VARCHAR(100))))hash_score,
 tdwm.hash_md5((XMLAGG(TRIM(h_name) ORDER BY h_age ASC )(VARCHAR(100))))hash_name,
 tdwm.hash_md5((XMLAGG(TRIM(h_entry) ORDER BY h_entry ASC )(VARCHAR(100))))hash_entry,
 SUM(Aggrownum) sum_val,
 COUNT(Aggrownum) count_val,
 sum_val/count_val row_num
 from 
 (
 Select 
  tdwm.hash_md5(CAST(age AS VARCHAR(100)))h_age ,
  tdwm.hash_md5(CAST(marks AS VARCHAR(100)))h_marks,
  tdwm.hash_md5(CAST(id AS VARCHAR(100)))h_id,
  tdwm.hash_md5(CAST(score AS VARCHAR(100)))h_score,
  tdwm.hash_md5(CAST(f_name AS VARCHAR(100)))h_name,
  tdwm.hash_md5(CAST(entry AS FORMAT 'yyyy-mm-ddbhh:mi:ss') (char (20)))h_entry,
 row_number() over (partition by dob order by  age asc) rno,round(rno/500.0) Aggrownum
 from tdwm.student_2
 ) A group by Aggrownum ORDER BY row_num;

Другие вопросы по теме