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

1

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

(3706, "[42000] [Teradata] [драйвер ODBC Teradata] Ошибка Teradata DatabaseSyntax: ожидается что-то между '(' и '('.")

Мой запрос:

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)
  • 0
    попытаться избежать двойных кавычек ("), как это \"
  • 0
    @ user4321 но в запросе нет " . Или вы имеете в виду \"""select ?
Показать ещё 9 комментариев
Теги:
pandas
teradata

1 ответ

2
Лучший ответ

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

Проблема с вашим запросом заключается в том, что он содержит функцию 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню