【问题标题】:Connecting to Teradata using Python使用 Python 连接到 Teradata
【发布时间】:2017-07-24 18:36:44
【问题描述】:

我正在尝试连接到 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")

谁能帮我弄清楚我的方法有什么问题?

【问题讨论】:

标签: python teradata pandas-to-sql


【解决方案1】:

我不确定您为什么使用 sqlalchemy。但是您可以探索使用 Teradata 模块连接到 Teradata,如另一个链接中所述: Connecting Python with Teradata using Teradata module

【讨论】:

  • 我想使用 pandas 数据框的 'to_sql' 功能。因此我使用了 sqlalchemy。问题出在数据框的索引上。当我使用以下代码时,问题现已解决; f3.to_sql(con=engine, name='sample', if_exists='replace', schema = 'schema_name', index = False)
  • 我收到以下有关 teradata 的错误。任何想法如何解决它?我正在使用蟒蛇。我可以使用 Pyodbc 从 Teradata 读取数据。我可以使用 sqlalchemy 从 Oracle 读取/写入。我正在尝试写信给 Teradata,但还没有运气。 NoSuchModuleError:无法加载插件:sqlalchemy.dialects:teradata
  • 你安装了 sqlalchemy 模块吗?
【解决方案2】:

要连接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)

【讨论】:

    【解决方案3】:

    在 Python 中连接到 Teradata 有多种方法。以下列表并不详尽。

    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 进行查询。见SQLAlchemy Session API

    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)
    

    【讨论】:

    • SQLAlchemy 使用什么样的驱动程序?也是odbc?
    • 我不知道 SQLAlchemy 使用的底层技术是什么,但我不认为是使用 ODBC 协议
    【解决方案4】:

    我在airflow中遇到了类似的问题,我用jars和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]# 
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2017-06-16
      • 2016-06-26
      • 2018-11-11
      • 2018-01-09
      • 2020-07-13
      • 1970-01-01
      • 2019-09-14
      • 2017-11-20
      相关资源
      最近更新 更多