首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >teradatasql Python模块只在脚本编写时工作,而在运行代码时不起作用。

teradatasql Python模块只在脚本编写时工作,而在运行代码时不起作用。
EN

Stack Overflow用户
提问于 2019-10-06 21:09:12
回答 2查看 6.2K关注 0票数 0

我在使用teradatasql包(从pypi安装)时遇到了一个特殊的问题。我使用以下代码(让我们称之为pytera.py)来查询数据库:

代码语言:javascript
复制
from dotenv import load_dotenv
import pandas as pd
import teradatasql

# Load the database credentials from .env file
_ = load_dotenv()
db_host = os.getenv('db_host')
db_username = os.getenv('db_username')
db_password = os.getenv('db_password')


def run_query(query):
    """Run query string on teradata and return DataFrame."""
    if query.strip()[-1] != ';':
        query += ';'

    with teradatasql.connect(host=db_host, user=db_username,
                         password=db_password) as connect:
        df = pd.read_sql(query, connect)
    return df

当我在IPython/Python解释器或朱庇特笔记本中导入这个函数时,我可以运行如下所示的查询:

代码语言:javascript
复制
import pytera as pt

pt.run_query('select top 5 * from table_name;')

但是,如果我将上面的代码保存在一个.py文件中并尝试运行它,我大部分时间都会收到一条错误消息(不是所有时间)。错误消息在下面。

代码语言:javascript
复制
E   teradatasql.OperationalError: [Version 16.20.0.49] [Session 0] [Teradata SQL Driver] Hostname lookup failed for None
E    at gosqldriver/teradatasql.(*teradataConnection).makeDriverError TeradataConnection.go:1046
E    at gosqldriver/teradatasql.(*Lookup).getAddresses CopDiscovery.go:65
E    at gosqldriver/teradatasql.discoverCops CopDiscovery.go:137
E    at gosqldriver/teradatasql.newTeradataConnection TeradataConnection.go:133
E    at gosqldriver/teradatasql.(*teradataDriver).Open TeradataDriver.go:32
E    at database/sql.dsnConnector.Connect sql.go:600
E    at database/sql.(*DB).conn sql.go:1103
E    at database/sql.(*DB).Conn sql.go:1619
E    at main.goCreateConnection goside.go:229
E    at main._cgoexpwrap_e6e101e164fa_goCreateConnection _cgo_gotypes.go:214
E    at runtime.call64 asm_amd64.s:574
E    at runtime.cgocallbackg1 cgocall.go:316
E    at runtime.cgocallbackg cgocall.go:194
E    at runtime.cgocallback_gofunc asm_amd64.s:826
E    at runtime.goexit asm_amd64.s:2361
E   Caused by lookup None on <ip address redacted>: server misbehaving

我在Ubuntu (WSL) 18.04上使用Python 3.7.3和teradatasql 16.20.0.49。

也许不是巧合,在Windows上尝试类似的工作流时,我遇到了类似的问题(使用了teradata和安装了Teradata驱动程序)。当我在解释器或木星内连接时工作,而不是在脚本中。在Windows情况下,错误是:

代码语言:javascript
复制
E teradata.api.DatabaseError: (10380, '[08001] [Teradata][ODBC] (10380) Unable to establish connection with data source. Missing settings: {[DBCName]}')

我有一种感觉,我缺少一些基本的东西,但我在任何地方都找不到解决这个问题的办法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-07 13:41:49

谢谢意式馄饨的新眼睛。结果发现问题是使用dotenv在环境变量中加载。我的模块位于package (单独的文件夹)中,我的脚本和.env文件位于工作目录中。

当我在最初的文章中逐行、在解释器或朱庇特中运行代码时,dotenv成功地读取了环境变量(工作目录中的.env)。但是,当我在脚本中运行相同的代码时,它在我的工作目录中的.env文件中找不到。这将是另一个问题,我将不得不找到答案。

代码语言:javascript
复制
import teradatasql
import pandas as pd


def run_query(query, db_host, db_username, db_password):
    """Run query string on teradata and return DataFrame."""
    if query.strip()[-1] != ';':
        query += ';'

    with teradatasql.connect(host=db_host, user=db_username,
                         password=db_password) as connect:
        df = pd.read_sql(query, connect)
    return df

下面的代码现在在脚本中运行得很好:

代码语言:javascript
复制
import pytera as pt
from dotenv import load_dotenv()

_ = load_dotenv()
db_host = os.getenv('db_host')
db_username = os.getenv('db_username')
db_password = os.getenv('db_password')

data = pt.run_query('select top 5 * from table_name;', db_host, db_username, db_password)
票数 2
EN

Stack Overflow用户

发布于 2019-10-07 05:49:59

您的客户端似乎找不到Teradata服务器,这就是您看到DBCName丢失错误的原因。这应该是Teradata (即TDServProdA)的“系统名称”。

有几件事要尝试:

  1. 如果您试图使用主机名直接连接,请尝试禁用与此标志:cop = false的连接中的COP发现。更多信息
  2. 尝试更新本地系统上的hosts文件。从文件中:

如果站点不使用DNS,则必须修改主机文件,必须定义要在计算机上的系统主机文件中使用的IP地址和Teradata名称。

  1. 在计算机上找到主机文件。此文件通常位于以下文件夹中:%SystemRoot%\system32 32\驱动器\etc
  2. 使用文本编辑器(如记事本)打开文件。
  3. 向文件中添加以下条目: xxx.xx.xxx.xxx sssCOP1,其中xxx.xx.xxx.xxx是IP地址,sss是Teradata。
  4. 保存主机文件。

链接1

链接2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58261239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档