【问题标题】:teradatasql Python module only works when scripting but not when running codeteradatasql Python 模块仅在编写脚本时有效,但在运行代码时无效
【发布时间】:2023-03-31 03:25:01
【问题描述】:

我在使用 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 解释器或 Jupyter Notebook 中导入此函数时,我可以像这样运行查询:

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 Python 驱动程序)。当我在解释器或 Jupyter 中连接时工作,但在脚本中不工作。在 Windows 的情况下,错误是:

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

我觉得我缺少一些基本的东西,但我在任何地方都找不到解决方案。

【问题讨论】:

    标签: python sql teradata dotenv


    【解决方案1】:

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

    有几件事可以尝试:

    1. 如果您尝试使用主机名直接连接,请尝试在您的连接中使用以下标志禁用 COP 发现:cop = falseMore info

    2. 尝试更新本地系统上的 hosts 文件。来自文档:

    修改主机文件

    如果您的站点不使用 DNS,则必须定义 IP 地址和 要在系统主机文件中使用的 Teradata Database 名称 电脑。

    1. 在计算机上找到 hosts 文件。此文件通常位于以下文件夹中:%SystemRoot%\system32\drivers\etc
    2. 使用文本编辑器(例如记事本)打开文件。
    3. 将以下条目添加到文件中:xxx.xx.xxx.xxx sssCOP1 其中 xxx.xx.xxx.xxx 是 IP 地址,其中 sss 是 Teradata 数据库名称。

    4. 保存主机文件。

    Link 1
    Link 2

    【讨论】:

      【解决方案2】:

      感谢ravioli 的新鲜眼睛。原来问题是使用 dotenv 加载环境变量。我的模块在 Python 包(单独的文件夹)中,我的脚本和 .env 文件在工作目录中。

      当我在解释器或 Jupyter 中逐行运行原始帖子中的代码时,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)
      
      

      【讨论】:

      • 好的,没问题。
      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多