查询在查询浏览器中运行良好,但在 python 代码中运行不正常
Query is working fine in query browser but not in python code
我有一个 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)
我遇到了类似的问题..
您的查询的问题在于它包含 teradata python module
未知的 hash_md5
函数,这就是错误的原因。
解决方案:
在该函数之前添加数据库名称(就像您在 table 名称 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;
我有一个 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)
我遇到了类似的问题..
您的查询的问题在于它包含 teradata python module
未知的 hash_md5
函数,这就是错误的原因。
解决方案:
在该函数之前添加数据库名称(就像您在 table 名称 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;