【问题标题】:How to use Volatile Tables in Python Teradata module PyTD如何在 Python Teradata 模块 PyTD 中使用易失性表
【发布时间】:2018-09-14 14:51:31
【问题描述】:

有人知道如何在 PyTd Teradata ODBC 模块中使用易失性表吗?我可以运行单个查询并让结果返回,但是如果我尝试使用易失性表构建查询,我会不断收到错误消息。有什么帮助吗?我对 python 还很陌生。

我正在使用

udaExec = td.UdaExec (appName="dpull", version="1.0",logConsole=False)
with udaExec.connect(method="ODBC",dsn="tdata", username="un", 
password="pw") as session:

query = """"
create volatile table vol_table
,no fallback, no before journal, no after journal as 
    (
    select a, b, c
    from my_table1
    )
with data primary index (a)
on commit preserve rows

Select vt.a, vt.b, vt.c, t2.a
from vol_table vt
inner join table2 t2
on vt.anything = t2.anything
""""
df = pd.read_sql(query,session)

错误:

 `InterfaceError: ('SQL_INVALID_HANDLE', 'Invalid handle passed to SQLGetDiagRecW.')`

【问题讨论】:

  • 不知道 TyPd,但是 sql 看起来不对。应该是PRIMARY INDEX (a) WITH DATA ON COMMIT PRESERVE ROWS; Select...select a,b,c需要from <table>。最后缺少;。你有没有直接在任何客户端尝试 sql?
  • 感谢您指出缺少的“来自 ”。 “主索引”上的 sql 适用于我在 Teradata 中的逻辑。我确实从一个真实的查询中改编了这个示例查询。就在我尝试添加易失性表时,我通过 Python Teradata 模块查询单个查询没有任何问题。我正在尝试使用其他脚本对每个查询调用 session.execute(my_query) 以查看是否有效。更多内容...
  • 查询定义和select之间还是少了一个;; at the end. The )`后面preserve rows太多了,没有对应的开口(。根据会话默认模式(ansi 或 Teradata),在create table 之后的 ansi 模式中需要commit;
  • 感谢您指出这一点,但问题不在于查询。正如您所指出的,我在编写示例查询时有拼写错误。假设查询很好,我想知道为什么我在尝试使用 Teradata Python 模块中的易失性表时收到错误消息。
  • 所以我尝试运行并更正查询,现在我收到错误:(3932, '[25000] [Teradata][ODBC Teradata Driver][Teradata Database] Only an ET or null statement is legal after a DDL Statement. ')

标签: python sql pandas teradata


【解决方案1】:

好的,感谢Teradata forum 的一些帮助,我能够解决这个问题。您可以按照相同的结构添加任意数量的查询:

import teradata as td
import pandas as pd
from teradata import tdodbc

udaExec = td.UdaExec (appName="dpull", version="1.0",logConsole=False)
with udaExec.connect(method="ODBC",dsn="tdata", username="un", 
password="pw") as session:

query1 = """
    create volatile table vol_table
    ,no fallback, no before journal, no after journal as 
        (
        select a, b, c
        from my_table1
        )
     with data primary index (a)
     on commit preserve rows;
"""
query2 = """
    Select vt.a, vt.b, vt.c, t2.x
    from vol_table vt
    inner join table2 t2
    on vt.a = t2.a
"""
session.execute(query1)
df = pd.read_sql(query2,session)

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2016-07-27
    • 2016-04-25
    • 2017-01-31
    • 2013-11-29
    相关资源
    最近更新 更多