我在使用teradatasql包(从pypi安装)时遇到了一个特殊的问题。我使用以下代码(让我们称之为pytera.py)来查询数据库:
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解释器或朱庇特笔记本中导入这个函数时,我可以运行如下所示的查询:
import pytera as pt
pt.run_query('select top 5 * from table_name;')但是,如果我将上面的代码保存在一个.py文件中并尝试运行它,我大部分时间都会收到一条错误消息(不是所有时间)。错误消息在下面。
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情况下,错误是:
E teradata.api.DatabaseError: (10380, '[08001] [Teradata][ODBC] (10380) Unable to establish connection with data source. Missing settings: {[DBCName]}')我有一种感觉,我缺少一些基本的东西,但我在任何地方都找不到解决这个问题的办法。
发布于 2019-10-07 13:41:49
谢谢意式馄饨的新眼睛。结果发现问题是使用dotenv在环境变量中加载。我的模块位于package (单独的文件夹)中,我的脚本和.env文件位于工作目录中。
当我在最初的文章中逐行、在解释器或朱庇特中运行代码时,dotenv成功地读取了环境变量(工作目录中的.env)。但是,当我在脚本中运行相同的代码时,它在我的工作目录中的.env文件中找不到。这将是另一个问题,我将不得不找到答案。
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下面的代码现在在脚本中运行得很好:
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)发布于 2019-10-07 05:49:59
您的客户端似乎找不到Teradata服务器,这就是您看到DBCName丢失错误的原因。这应该是Teradata (即TDServProdA)的“系统名称”。
有几件事要尝试:
cop = false的连接中的COP发现。更多信息hosts文件。从文件中:如果站点不使用DNS,则必须修改主机文件,必须定义要在计算机上的系统主机文件中使用的IP地址和Teradata名称。
https://stackoverflow.com/questions/58261239
复制相似问题