在 Python 中使用 teradatasql 模块连接到 Teradata

Kri*_*itz 5 python teradata

我正在尝试使用 Python 中的 teradatasql 模块连接到 Teradata。该代码在本地主机上运行良好,但是一旦作为服务器代码的一部分部署在服务器上,就会抛出错误。

\n\n

代码:

\n\n
import teradatasql\ntry:\n    host, username, password = \'hostname\', \'username\', \'****\'\n    session = teradatasql.connect(host=host, user=username, password=password, logmech="LDAP")\n\nexcept Exception as e:\n    print(e)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在服务器上遇到错误:

\n\n
\n

[版本 16.20.0.60] [会话 0] [Teradata SQL 驱动程序] 在 gosqldriver/teradatasql 处接收配置响应消息头 \xe2\x86\xb5 失败。\n (*teradataConnection).makeDriverError TeradataConnection.go:1101\xe2\x86\ xb5 位于 gosqldriver/teradatasql。\n (*teradataConnection).sendAndReceive TeradataConnection.go:1397\xe2\x86\xb5 位于 gosqldriver/teradatasql.newTeradataConnection TeradataConnection.go:180\xe2\x86\xb5 位于 gosqldriver/teradatasql。(*teradataDriver ).\n 打开 TeradataDriver.go:32\xe2\x86\xb5 位于数据库/sql.dsnConnector.Connect sql.go:600\xe2\x86\xb5 位于数据库/sql.(*DB).conn sql.go: 1103\xe2\x86\xb5 位于数据库/sql。\n (*DB).Conn sql.go:1619\xe2\x86\xb5 位于 main.goCreateConnection goside.go:275\xe2\x86\xb5 位于 main.\ n _cgoexpwrap_212fad278f55_goCreateConnection _cgo_gotypes.go:240\xe2\x86\xb5 在运行时.call64 asm_amd64.s:574\xe2\x86\xb5 在运行时.cgocallbackg1 cgocall.go:316\xe2\x86\xb5 在运行时.cgocallbackg cgocall。去:194\xe2\x86\xb5 在运行时.cgocallback_gofunc asm_amd64.s:826\xe2\x86\xb5 在运行时.goexit asm_amd64.s:2361\xe2\x86\xb5 由读取 tcp IP:PORT->IP:PORT: 引起wsarecv:现有连接被远程主机强制关闭

\n
\n

Tyl*_*der 1

tomnolan在此概述了此错误的根本原因:

堆栈跟踪表明已与数据库建立 TCP 套接字连接,然后驱动程序将配置请求消息传输到数据库,然后驱动程序在等待来自数据库的配置响应消息时超时。

换句话说,驱动程序认为它已经建立了 TCP 套接字连接,但 TCP 套接字连接可能并未完全成功,因为驱动程序和数据库之间的初始消息握手发生了故障。

最可能的原因是某种网络问题阻止驱动程序正确连接到数据库。

我今天遇到了这个问题,并通过更改主机解决了它。我也在 VPN 上,发现 DNS 中的实际主机名不起作用,但可用的 ALIAS 起作用。例如在 Windows 上:

C:\WINDOWS\system32>nslookup MYDB-TEST # <-- works
Server:  abcd.domain.com
Address: <OMITTED>
Name:    MYDB.domain.com # <-- doesn't work
Address:  <OMITTED>
Aliases:  mydb-test.domain.com # <-- works
Run Code Online (Sandbox Code Playgroud)

我认识到这可能是一个特定的解决方案选项,可能并不适合所有人,但根据我的经验,问题的根源被确认为 TCP 连接问题。