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)
3 Réponses :
À 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/')
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?
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.
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