Подключение к Teradata с использованием Python
Я пытаюсь подключиться к серверу teradata и загрузить таблицу данных в таблицу, используя python. Вот мой код -
import sqlalchemy
engine = sqlalchemy.create_engine("teradata://username:passwor@hostname:port/")
f3.to_sql(con=engine, name='sample', if_exists='replace', schema = 'schema_name')
Но я получаю следующую ошибку -
InterfaceError: (teradata.api.InterfaceError) ('DRIVER_NOT_FOUND', "No driver found for 'Teradata'. Available drivers: SQL Server,SQL Server Native Client 11.0,ODBC Driver 13 for SQL Server")
Кто-нибудь может помочь мне понять, что не так в моем подходе?
3 ответа
Есть разные способы подключения к Teradata в Python. Следующий список не является исчерпывающим.
SQLAlchemy
Если вы хотите использовать SQLAlchemy, вам также необходимо установить пакет SQLAlchemy-Teradata. Вот как вы можете подключиться:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
from sqlalchemy.orm import scoped_session, sessionmaker
[...]
# Connect
engine = create_engine('teradata://' + user + ':' + password + '@' + host + ':22/' + database)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
db_session.execute('SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;') # To avoid locking tables when doing select on tables
db_session.commit()
Base = declarative_base(cls=DeferredReflection)
Base.query = db_session.query_property()
Тогда вы можете использовать db_session
делать запросы. См. API сеанса SQLAlchemy
Pyodbc
Если вы хотите использовать Pyodbc, вам сначала нужно установить драйвер Teradata на ваш компьютер. Пример на моем, после установки драйвера Teradata у меня есть следующая запись в /etc/odbcinst.ini
[Teradata]
Driver=/opt/teradata/client/16.00/odbc_64/lib/tdata.so
APILevel=CORE
ConnectFunctions=YYY
DriverODBCVer=3.51
SQLLevel=1
Тогда я могу соединиться со следующим:
import pyodbc
[...]
#Teradata Connection
connection= pyodbc.connect("driver={Teradata};dbcname=" + host + ";uid=" + user + ";pwd=" + pwd + ";charset=utf8;", autocommit=True)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8')
connection.setencoding(encoding='utf-8')
cursor= n.cursor()
cursor.execute("Select 'Hello World'")
for row in cursor:
print (row)
Чтобы подключиться к базе данных teradata, вам нужен pyodbc, у меня также есть проблемы с диалектом teradata.
Пример:
import pyodbc
user = 'user'
pasw = 'pass'
host = 'host'
connection = pyodbc.connect('DRIVER=Teradata;DBCNAME=' + host +';UID=' + user + ';PWD=' + pasw +';QUIETMODE=YES', autocommit=True,unicode_results=True)
Я не уверен, почему вы используете sqlalchemy. Но вы можете изучить использование модуля Teradata для подключения к Teradata, как описано в другой ссылке: Подключение Python к Teradata с использованием модуля Teradata
Я встретил аналогичную проблему с воздушным потоком, я использовал jar-файлы и jaydebeapi для подключения базы данных teradata и выполнения sql:
[root@myhost transfer]# cat test_conn.py
import jaydebeapi
from contextlib import closing
jclassname='com.teradata.jdbc.TeraDriver'
jdbc_driver_loc = '/opt/spark-2.3.1/jars/terajdbc4-16.20.00.06.jar,/opt/spark-2.3.1/jars/tdgssconfig-16.20.00.06.jar'
jdbc_driver_name = 'com.teradata.jdbc.TeraDriver'
host='my_teradata.address'
url='jdbc:teradata://' + host + '/TMODE=TERA'
login="teradata_user_name"
psw="teradata_passwd"
sql = "SELECT COUNT(*) FROM A_TERADATA_TABLE_NAME where month_key='202009'"
conn = jaydebeapi.connect(jclassname=jdbc_driver_name,
url=url,
driver_args=[login, psw],
jars=jdbc_driver_loc.split(","))
with closing(conn) as conn:
with closing(conn.cursor()) as cur:
cur.execute(sql)
print(cur.fetchall())
[root@myhost transfer]# python test_conn.py
[(7734133,)]
[root@myhost transfer]#