【问题标题】:Python connect to Teradata in AWS EC2Python 连接到 AWS EC2 中的 Teradata
【发布时间】:2017-02-14 09:26:43
【问题描述】:

我想从 Teradata 实例中提取数据。客户端代码在 AWS EC2 实例上运行 Python2.7+。

我安装了 unixODBC 驱动程序和sudo pip install teradata,但我仍然收到以下异常:

  File "/usr/local/lib/python2.7/site-packages/teradata/tdodbc.py", line 369, in determineDriver
"Available drivers: {}".format(dbType, ",".join(drivers)))
teradata.api.InterfaceError: ('DRIVER_NOT_FOUND', "No driver found for 'Teradata'.  Available drivers: PostgreSQL,MySQL")

代码如下:

import sys
import teradata
# my own imports
td = TeradataClient(DEFAULT_HOSTNAME, DEFAULT_USERNAME, DEFAULT_PASSWORD)
td.select(query, outfile)

我创建的调用Teradata的TeradataClient类如下:

class TeradataClient:
    def __init__(self, hostname, username, password):
        self._hostname = hostname
        self._username = username
        self._password = password
        self._udaExec = teradata.UdaExec(appName="MyApp", version="1.0", logConsole=False)


    def select(self, query, outfile, sep=DEFAULT_SEPARATOR, nullstr=DEFAULT_NULL_STR):
        with self._udaExec.connect(method="odbc", system=self._hostname, username=self._username,
                                          password=self._password) as session:
            print 'Connection to Teradata established'
            with open(outfile,'w') as fp:
                with session.cursor() as cursor:
                    for row in cursor.execute(query):
                        lineparts = [str(x if x!=None else nullstr) for x in row]
                        fp.write('%s\n' %sep.join(lineparts))

我该如何解决这个问题?是否需要安装其他 ODBC 驱动程序?

【问题讨论】:

  • 也许博托? link
  • boto3 已安装。
  • 请发布尝试的连接字符串。它可能是一个非常小的语法或缺少的属性。请添加所有import 行。
  • @Parfait:发布代码。相同的代码在 Macbook 上运行良好。它只在 Linux 系统上崩溃。所以启动正确的驱动程序有一些问题。

标签: python python-2.7 amazon-ec2 odbc teradata


【解决方案1】:

这为我解决了这个问题:

export ODBC_VERSION=14.10
export ODBCINI=/opt/teradata/client/$ODBC_VERSION/odbc_64/odbc.ini 
export ODBCINSTINI=/opt/teradata/client/$ODBC_VERSION/odbc_64/odbcinst.ini
export LD_LIBRARY_PATH=/opt/teradata/client/$ODBC_VERSION/odbc_64/lib:/opt/teradata/client/$ODBC_VERSION/tdicu/lib64:$LD_LIBRARY_PATH
export NLSPATH=/opt/teradata/client/$ODBC_VERSION/odbc_64/msg/tdodbc.cat

注意:

  • 根据需要更改 $ODBC_VERSION
  • 更新/etc/resolv.confsystem kwarg 在udaExec.connect

【讨论】:

    【解决方案2】:

    我今天遇到这个问题,发现它是由最新版本的 teradata python 包之一引起的。使用 pip 安装 15.10.0.10 版允许我从我的 RHEL 实例进行连接。

    【讨论】:

    • 谢谢亚历克斯。我切换到使用 REST 接口,因此我不必完全处理驱动程序。现在好多了。
    【解决方案3】:

    听起来您需要安装 Teradata ODBC 驱动程序。

    可在 Teradata Developer Exchange 上获得。 http://downloads.teradata.com/download/connectivity

    【讨论】:

    • 我已经安装了驱动程序,但它没有显示在驱动程序列表中。
    • 会不会是驱动程序是 64 位而 python 是 32 位(反之亦然)?这可能会导致驱动程序无法显示在 Windows 中,不确定 Unix/Linux。
    【解决方案4】:

    我知道我迟到了大约 2 年,但我今天遇到了同样的问题并找到了解决方案。请转到 /usr/lib64 并检查以下两个符号链接:

    lrwxrwxrwx 1 root root 20 Oct 18 10:56 libodbcinst.so -> libodbcinst.so.2.0.0
    lrwxrwxrwx 1 root root 20 Oct 18 10:56 libodbcinst.so.2 -> libodbcinst.so.2.0.0
    

    如果它们不指向 teradata,它将无法正常工作!它们应该指向 teradata odbc 安装目录:

    修复(使用风险自负,没有任何担保);):

    sudo rm /usr/lib64/libodbc.so
    sudo rm /usr/lib64/libodbcinst.so
    sudo ln -s /opt/teradata/client/16.20/lib64/libodbc.so /usr/lib64/libodbc.so
    sudo ln -s /opt/teradata/client/16.20/lib64/libodbcinst.so /usr/lib64/libodbcinst.so
    

    结果:

    lrwxrwxrwx 1 root root 47 Oct 25 20:10 libodbcinst.so -> /opt/teradata/client/16.20/lib64/libodbcinst.so
    lrwxrwxrwx 1 root root 43 Oct 25 20:10 libodbc.so -> /opt/teradata/client/16.20/lib64/libodbc.so
    

    瞧,与 Teradata 的连接应该像黄油一样顺畅!

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2018-10-17
      • 2021-09-18
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多