У меня есть запрос 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, но в запросе нет ". Или ты про \"""select ?
Похоже, что синтаксический анализатор не находит hash_md5 UDF. Отправляющий пользователь может иметь другую базу данных по умолчанию.
@dnoeth, могу ли я отправить запрос на сервер teradataне разбирая его сначала в python?
почему у вас есть что-то вроде трех двойных кавычек в строке запроса? Когда вы говорите, что это работает в Teradata Studio, включаете ли вы туда все эти двойные кавычки?
@Andrew Нет, я не включаю эти """ при выполнении там запроса. Даже если я дам один " вместо трех, проблема не исчезнет.
Я предлагаю распечатать вашу переменную td_query на python. Скопируйте это, посмотрите, работает ли он в TD Studio.
@Andrew ... тройная двойная кавычка - это многострочная строка Python или комментарий. Эти кавычки не появляются внутри строки.
@Parfait добавил соответствующий код, пожалуйста, проверьте
Что такое td? Пожалуйста, включите строки import. А вы проверяли точный запрос в Studio Express с пользователем dbac на сервере 10.20.181.55? И проверьте, в какой db / schema существует сохраненная функция hash_mdf5() и есть ли у dbac доступ к ней.
@Parfait Я опубликовал обновленный код, и да, этот запрос работает со Studio Express с пользователем dbac на сервере по адресу 10.20.181.55






Я столкнулся с подобной проблемой ..
Проблема с вашим запросом заключается в том, что он содержит функцию 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;
попробуйте избежать двойных кавычек (") как это \"