3
votes

Existe-t-il un moyen de stocker une trame de données pandas dans une table Teradata

J'ai créé un cadre de données pandas 'df' et j'essaie de le stocker dans une 'table' à l'aide de l'assistant Teradata-SQL.

Chaîne de connexion -

Traceback (most recent call last):

 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\base.py", line 2158, in _wrap_pool_connect
return fn()
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 410, in connect
return _ConnectionFairy._checkout(self, self._threadconns)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 788, in _checkout
fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 529, in checkout
rec = pool._do_get()
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 1096, in _do_get
c = self._create_connection()
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 347, in _create_connection
return _ConnectionRecord(self)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 474, in __init__
self.__connect(first_connect_check=True)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 671, in __connect
connection = pool._invoke_creator(self)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\strategies.py", line 106, in connect
 return dialect.connect(*cargs, **cparams)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\default.py", line 412, in connect
return self.dbapi.connect(*cargs, **cparams)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\teradata\tdodbc.py", line 454, in __init__
checkStatus(rc, hDbc=self.hDbc, method="SQLDriverConnectW")
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\teradata\tdodbc.py", line 231, in checkStatus
raise DatabaseError(i[2], u"[{}] {}".format(i[0], msg), i[0])
teradata.api.DatabaseError: (8017, '[28000] [Teradata][ODBC Teradata Driver][Teradata Database] The UserId, Password or Account is invalid. , [Teradata][ODBC Teradata Driver][Teradata Database] The UserId, Password or Account is invalid. ')

J'ai essayé avec: df.to_sql ('table', con = conn)

Cela ne fonctionne pas.

Existe-t-il un moyen plus simple pour stocker un dataframe dans une table.

Toute aide est appréciée.

Merci.

conn = pyodbc.connect(
         "DRIVER=Teradata;DBCNAME=tdprod;Authentication=LDAP;UID=" + username + ";PWD=" + password + ";QUIETMODE=YES",
        autocommit=True, unicode_results=True)

cursor = conn.cursor().execute(sql)


0 commentaires

3 Réponses :


2
votes

À partir de la documentation pour to_sql :

df.to_sql('table', engine)

Vous pouvez voir que vous avez besoin de sqlalchemy ou sqlite3, mais pas de pyodbc.

Vous avez besoin des éléments suivants pour créer un moteur pour Teradata:

XXX

Vous l'utiliseriez alors comme

from sqlalchemy import create_engine

engine = create_engine(f'teradata://{username}:{password}@tdprod:22/')


5 commentaires

La solution ne semble pas fonctionner. Il lance un message d'erreur - sqlalchemy.exc.DatabaseError: (teradata.api.DatabaseError). Pour une raison quelconque, il indique que UserId, Password ou Account est invalide. J'ai vérifié mon compte et cela fonctionne bien.


Pourriez-vous mettre à jour la question avec la trace complète de la pile? Il est difficile de déboguer avec uniquement le nom de l'erreur.


Il semble que le nom d'utilisateur ou le mot de passe soit incorrect. Jouez simplement avec la chaîne sqlalchemy connect jusqu'à ce que cela fonctionne.


Donc, j'ai joué un peu et cela semble fonctionner - create_engine ('teradata: //' + user + ':' + password + '@' + host + ': 1025 /' + '/' + '? Authentication = LDAP '). Je suppose que nous avons besoin du nom d'hôte et de l'authentification dans la chaîne de connexion.


Comment ajouter le datalab et le nom de la table en utilisant df.to_sql?



0
votes

create_engine ('teradata: //' + utilisateur + ':' + mot de passe + '@' + hôte + ': 1025 /' + '/' + '? authentication = LDAP') L'ajout du nom d'hôte et de l'authentification à la chaîne de connexion a fonctionné pour moi.


0 commentaires

1
votes

J'ai fait quelques recherches et cette solution fait le travail et le fait rapidement - en utilisant le module python teradata:

import teradata
import numpy as np
import pandas as pd


num_of_chunks = 100  #breaking the data into chunks is optional - use if you have many rows or would like to view status updates

query = 'insert into SomeDB.SomeTeraDataTable'
df = someDataframe

#set host, user, password params
host,username,password = 'hostName_or_IPaddress','username', 'password'

#connet to DB using UdaExec
udaExec = teradata.UdaExec (appName="IMC", version="1.0", logConsole=False)


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


    df_chunks = np.array_split(df, num_of_chunks)

    for i,_ in enumerate(df_chunks):

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

        connect.executemany(query, data,batch=True)

solution basée sur: ce stackoverflow post


0 commentaires