【问题标题】:Query is working fine in query browser but not in python code查询在查询浏览器中运行良好,但在 python 代码中运行良好
【发布时间】:2019-03-16 16:13:11
【问题描述】:

我有一个 teradata sql 查询,它在 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)            

其中connecttd.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 中解析它吗?
  • @Andrew ... 三重双引号是 Python 多行字符串或注释。这些引号不会出现在字符串中。

标签: python sql pandas teradata


【解决方案1】:

我遇到了类似的问题..

您的查询的问题是它包含teradata python module 未知的hash_md5 函数,这就是错误的原因。

解决办法:

在该函数之前添加数据库名称(就像您在表名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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多