Соединение Python с Teradata с использованием модуля Teradata

Я установил Python 2.7.0 и модуль Teradata на Windows 7. Я не могу подключиться и quyey TD из Python.

pip install Teradata

Теперь я хочу импортировать модуль teradata с использованием Python и выполнять такие операции, как -

  1. запускает запросы к teradata и получает набор результатов.
  2. проверьте, если установлено соединение с teradata. 3.etc..

Пожалуйста, помогите мне написать код для того же, что и я новичок в Python, и у меня нет никакой информации для подключения к teradata.

4 ответа

Решение

Существует несколько способов подключения к Teradata и экспорта таблицы в Pandas. Вот три:

Использование модуля teradata

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

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

Использование модуля pyodbc

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

 #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)

Существует четвертый способ, использующий модуль жирафа. Мне нравится использовать этот модуль, так как он поставляется с MLOAD, FASTLOAD, BULKEXPORT и т. Д. Единственная проблема для начинающих - это его требования (например, компилятор C/C++, заголовочные файлы Teradata CLIv2 и TPT API / файлы lib).

Примечание: обновлено 13-07-2018, используется менеджер контекста для обеспечения закрытия сессий

Обновление: 31-10-2018: использование teradata для отправки данных из df в teradata

Мы можем отправить данные из df в Teradata. Избегая лимита 'odbc' в 1 МБ, а также зависимости от драйвера odbc, мы можем использовать метод rest. Нам нужен хост ip_address, а не аргумент драйвера. NB. Порядок столбцов в 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', вы должны разделить свои данные на фрагменты размером менее 1 МБ, чтобы избежать ошибки "[HY001][Teradata][ODBC Teradata Driver] Ошибка выделения памяти": например

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)

Чтобы добавить к ответу Прайсона, вы можете использовать пакет teradatasql ( находится на 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)

Загрузите модуль 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;

Пожалуйста, найдите мое решение ниже.
(Для механизма аутентификации: Защищено паролем)

          import teradatasql
    DB_URL = ""                                 #Add Host
    USER = ""                                   #Add Username
    PASS = ""                                   #Add Password
    try:
        # Establish a connection to the Teradata database
        with teradatasql.connect(host=DB_URL, user=USER, password=PASS) as con:
            # Create a cursor to execute queries
            with con.cursor() as cur:
                try:
                    
                    cur.execute(f"select top 10 * from user.TEST")
     
                    # Extract data from the result set and print it
                    for row in cur:
                        print(f"Associate ID: {row[0]}")
                except teradatasql.DatabaseError as db_err:
                    # Handle any errors that occur during query execution
                    print("Error while executing the query:", db_err)
    except teradatasql.DatabaseError as db_err:
        # Handle any errors that occur during the database connection
        print("Error while connecting to the Teradata database:", db_err)
    for Authentication mechanism : LDAP
import teradata

udaExec = teradata.UdaExec(appName="MyApp", version="1.0", logConsole=True)

session = udaExec.connect(method="odbc", system="", username="", password="", authentication="LDAP")

var="select top 10 * from user.TEST"

for row in session.execute(var):
    print(row)
Другие вопросы по тегам