web-dev-qa-db-fra.com

Connexion Python avec Teradata en utilisant le module Teradata

J'ai installé python 2.7.0 et le module Teradata sur Windows 7. Je ne suis pas en mesure de me connecter et d'interroger TD à partir de python.

pip install Teradata

Maintenant, je veux importer le module de teradata dans mon code source et effectuer des opérations comme -

  1. Lancer des requêtes sur des teradata et obtenir un ensemble de résultats.
  2. Vérifiez si la connexion est établie avec les teradata.

S'il vous plaît aidez-moi à écrire du code pour la même chose que je suis nouveau à Python et il n'y a aucune information disponible avec moi pour me connecter à teradata.

10
anurag

Il existe plusieurs façons de se connecter à Teradata et d'exporter la table vers Pandas. En voici trois:

en utilisant le module de 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
# You don’t need of coffee 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

en utilisant le module 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)

Utilisation de module 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)

Il existe une quatrième façon, en utilisant module giraffez . J'aime utiliser ce module car il est fourni avec MLOAD, FASTLOAD, BULKEXPORT, etc. Le seul problème pour les débutants est ses exigences (par exemple, compilateur C/C++, Teradata CLIv2 et TPAD API headers/lib files).

Remarque: mise à jour le 13-07-2018, en utilisant le gestionnaire de contexte pour assurer la fermeture des sessions

Mise à jour: 31-10-2018: Utilisation de teradata pour envoyer des données de df à teradata

Nous pouvons envoyer des données de df à Teradata. En évitant la limite de 1 Mo 'odbc' et la dépendance du pilote odbc, nous pouvons utiliser la méthode 'reste'. Nous avons besoin de l'hôte ip_address, au lieu de l'argument du pilote. NB: L'ordre des colonnes dans df doit correspondre à l'ordre des colonnes dans la table 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)

En utilisant 'odbc', vous devez segmenter vos données en moins de 1 Mo pour éviter l'erreur "[HY001] [Teradata] [ODBC Teradata Driver] Memory allocation error": par ex.

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

Téléchargez le module Teradata Python et python pyodbc.pyd depuis Internet. Installez à l'aide de cmd install setup.py.

Voici l'exemple de script pour se connecter à des données et extraire des données:

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;

Pour ajouter à Prayson's réponse, vous pouvez utiliser le paquet teradatasql ( trouvé sur pypi ). Ce package ne vous oblige pas à installer les pilotes Teradata (autres que ce package). Utilisez-le comme ceci:

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)

0
ymzkala