【问题标题】:Connecting Python with Teradata using Teradata module使用 Teradata 模块将 Python 与 Teradata 连接
【发布时间】:2016-06-26 14:04:00
【问题描述】:

我在 Windows 7 上安装了 python 2.7.0 和 Teradata 模块。我无法从 python 连接和查询 TD。

pip install Teradata

现在我想在我的源代码中导入 teradata 模块并执行如下操作 -

  1. 向 teradata 发起查询并获取结果集。
  2. 检查是否已连接到 teradata。

请帮我编写代码,因为我是 Python 新手,我没有可用的信息来连接到 teradata。

【问题讨论】:

标签: python connection odbc teradata


【解决方案1】:

有多种方法可以连接到 Teradata 并将表导出到 Pandas。这里有四个+:

Using teradata module

# You can install teradata via PIP: pip install teradata
# to get a list of your odbc drivers names, you could do: teradata.tdodbc.drivers
# You don’t need to install teradata odbc driver if using method='rest'.     
# See sending data from df to teradata for connection example 

import teradata
import pandas as pd

host,username,password = 'HOST','UID', 'PWD'
#Make a connection
udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False)


with udaExec.connect(method="odbc",system=host, username=username,
                            password=password, driver="DRIVERNAME") as connect:

    query = "SELECT * FROM DATABASEX.TABLENAMEX;"

    #Reading query to df
    df = pd.read_sql(query,connect)
    # do something with df,e.g.
    print(df.head()) #to see the first 5 rows

Using TeradataSQL

来自@ymzkala:此软件包不需要您安装 Teradata 驱动程序(此软件包除外)。

# Installing python -m pip install teradatasql

import teradatasql

with teradatasql.connect(host='host', user='username', password='password') as connect:
    df = pd.read_sql(query, connect)

Using pyodbc module

import pyodbc

 #You can install teradata via PIP: pip install pyodbc
 #to get a list of your odbc drivers names, you could do: pyodbc.drivers()

#Make a connection
link = 'DRIVER={DRIVERNAME};DBCNAME={hostname};UID={uid};PWD={pwd}'.format(
                      DRIVERNAME=DRIVERNAME,hostname=hostname,  
                      uid=username, pwd=password)
with pyodbc.connect(link,autocommit=True) as connect:

    #Reading query to df
    df = pd.read_sql(query,connect)

使用sqlalchemy Module

 #You can install sqlalchemy via PIP: pip install sqlalchemy-teradata
 #Note: It is not pip install sqlalchemy. If you already have sqlalchemy, you still need sqlalchemy-teradata to get teradata dialects

from sqlalchemy import create_engine

#Make a connection

link = 'teradata://{username}:{password}@{hostname}/?driver={DRIVERNAME}'.format(
               username=username,hostname=hostname,DRIVERNAME=DRIVERNAME)

with create_engine(link) as connect:

    #Reading query to df
    df = pd.read_sql(query,connect)

还有第五种方式,使用giraffez module。我喜欢使用这个模块,因为它带有 MLOAD、FASTLOAD、BULKEXPORT 等。对于初学者来说唯一的问题是它的要求(例如 C/C++ 编译器、Teradata CLIv2 和 TPT API 头文件/lib 文件)。

注意:2018 年 7 月 13 日更新,使用上下文管理器确保会话关闭

更新:31-10-2018:使用 teradata 将数据从 df 发送到 teradata

我们可以将数据从 df 发送到 Teradata。避免 'odbc' 1 MB 限制和 odbc 驱动程序依赖,我们可以使用 'rest' 方法。我们需要主机 ip_address,而不是驱动程序参数。 注意: df 中的列顺序应与 Teradata 表中的列顺序一致。

import teradata
import pandas as pd

# HOST_IP can be found by executing *>>nslookup viewpoint* or *ping  viewpoint* 
udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False) 
with udaExec.connect(method="rest",system="DBName", username="UserName",
                      password="Password", host="HOST_IP_ADDRESS") as connect:

    data = [tuple(x) for x in df.to_records(index=False)]

    connect.executemany("INSERT INTO DATABASE.TABLEWITH5COL values(?,?,?,?,?)",data,batch=True)

使用“odbc”,您必须将数据分块为小于 1MB 的块,以避免出现“[HY001][Teradata][ODBC Teradata Driver] Memory allocation error”错误:例如

import teradata
import pandas as pd
import numpy as np

udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False)

with udaExec.connect(method="odbc",system="DBName", username="UserName",
                      password="Password", driver="DriverName") as connect:

    #We can divide our huge_df to small chuncks. E.g. 100 churchs
    chunks_df = np.array_split(huge_df, 100)

    #Import chuncks to Teradata
    for i,_ in enumerate(chunks_df):

        data = [tuple(x) for x in chuncks_df[i].to_records(index=False)]
        connect.executemany("INSERT INTO DATABASE.TABLEWITH5COL values(?,?,?,?,?)",data,batch=True)

【讨论】:

  • teradata.api.DatabaseError: (0, '[HY000] [Teradata][ODBC Teradata Driver] Loading the Teradata ICU Library Failed. Error is: 126, The driver returned invalid (or failed to return ) SQL_DRIVER_ODBC_VER: 03.80')
  • 当你打印(teradata.tdodbc.drivers)时,你能看到正确的驱动名称吗?我最初的想法是您可能已经安装/更新了您的 teradata odbc 驱动程序,并且需要显式地为驱动程序分配一个正确的名称,因为默认的“teradata”不匹配。
  • 注意:最好的方法是使用'with'语法。这将确保会话关闭。
  • 非常有用的笔记。 @PraysonDaniel 我只是有一个关于将数据帧保存到 Teradata 的查询。你能告诉我一个将 Panda Dataframe 保存到已经存在的 Teradata 表中的示例(无需在 python 中执行 create table 语句)。
  • 感谢 JKC。我在这里间接回答了这个问题:stackoverflow.com/questions/43641122/…
【解决方案2】:

要添加到Prayson's 答案,您可以使用 teradatasql 包 (found on pypi)。此软件包不需要您安装 Teradata 驱动程序(此软件包除外)。像这样使用它:

import teradatasql
import pandas as pd

with teradatasql.connect(host='host', user='username', password='password') as connect:
    data = pd.read_sql('select top 5 * from table_name;', connect)

【讨论】:

  • 谢谢,我会将其添加到列表中,以便在一个地方拥有完整的列表。
  • 这里,传递加密/编码的凭据,使用哪种标准方法
【解决方案3】:

从 Internet 下载 Teradata Python 模块和 python pyodbc.pyd。 使用 cmd install setup.py 安装。

这是连接到 teradata 和提取数据的示例脚本:

import teradata
import pyodbc
import sys



udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0",
        logConsole=False)

session = udaExec.connect(method="odbc", dsn="prod32",
        username="PRODRUN", password="PRODRUN");

i = 0
REJECTED = 'R';

f = file("output.txt","w");sys.stdout=f

cursor =  session.cursor();

ff_remaining = 0;

cnt = cursor.execute("SELECT  SEQ_NO,FRQFBKDC,PNR_RELOC FROM ttemp.ffremaining ORDER BY 1,2,3 ").rowcount;
rows = cursor.execute("SELECT  SEQ_NO,FRQFBKDC,PNR_RELOC FROM ttemp.ffremaining ORDER BY 1,2,3 ").fetchall();


for i in range(cnt):
    ff_remaining = cursor.execute("select count(*) as coun from  ttemp.ffretroq_paxoff where seq_no=? and status <> ?",(rows[i].seq_no,REJECTED)).fetchall();
    print ff_remaining[0].coun, rows[i].seq_no, REJECTED;

【讨论】:

  • session = udaExec.connect(method="odbc", dsn="prod32",driver=DriverName,username="PRODRUN", password="PRODRUN");我们还需要在创建会话时将驱动程序作为参数传递。
  • 出现以下错误 teradata.api.DatabaseError: (0, '[HY000] [Teradata][ODBC Teradata Driver] 加载 Teradata ICU 库失败。错误为:126,驱动程序返回无效(或未能返回)SQL_DRIVER_ODBC_VER:03.80')
  • 是否有理由同时使用 teradata 和 pyodbc。 ;)?
猜你喜欢
  • 2018-11-11
  • 2019-09-14
  • 2020-07-13
  • 2012-01-04
  • 2017-07-24
  • 2017-07-11
  • 2018-06-16
  • 2020-03-15
  • 2015-10-22
相关资源
最近更新 更多