使用 pyodbc 从 Linux 向 Windows SQL Server 进行身份验证

新手上路,请多包涵

我正在尝试使用 pyodbc 从 linux 机器连接到 windows SQL Server。

我确实有几个限制:

  • 需要用windows域账号登录
  • 需要使用python3
  • 需要从Linux到Windows
  • 需要连接到特定实例

我按照微软的描述设置了环境并让它工作(我可以导入 pyodbc 并使用配置的贻贝驱动程序)。

我不熟悉 Windows 域身份验证等等,所以我的问题出在哪里。

我的连接字符串:

 DRIVER={ODBC Driver 17 for SQL Server};SERVER=myserver.mydomain.com;PORT=1433;DATABASE=MyDatabase;Domain=MyCompanyDomain;Instance=MyInstance;UID=myDomainUser;PWD=XXXXXXXX;Trusted_Connection=yes;Integrated_Security=SSPI

假设应该使用“Trusted_Connection”来使用 Windows 域身份验证,而不是直接使用 SQL 服务器进行身份验证。

运行 pyodbc.connect(connString) 时出现的错误:

 pyodbc.Error: ('HY000', '[HY000] [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (851968) (SQLDriverConnect)')

从其他来源我读到这应该在 Windows 上工作,因为此代码将使用当前登录用户的凭据。

我的问题是如何使用 Windows 域凭据从 Linux 连接到 Windows SQL Server 实例。

原文由 Esser420 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

我最终使用了 pymssql 库,它基本上是 FreeTDS 驱动程序之上的 pyodbc。它开箱即用。

奇怪我怎么这么难发现这个图书馆..

原文由 Esser420 发布,翻译遵循 CC BY-SA 3.0 许可协议

我为同一任务找到了两种方法。我有带有 AD 身份验证的 MSSQL 服务器。

您可以使用 JVM。加载并安装 JAVA https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html 。还要安装 JPype1 版本 0.6.3 pip install JPype==0.6.3 。高于 0.6.3 的版本将无法正常工作

import jaydebeapi
import pandas as pd
driver_name = "net.sourceforge.jtds.jdbc.Driver"
connection_url="jdbc:jtds:sqlserver://<server>:<port>/<database name>"
connection_properties = {
"domain": "<domain name>",
"user": "<username>",
"password": "<pwd>"}
jar_path =  <path to jsds>"/jtds-1.3.1.jar"
CONN = jaydebeapi.connect(driver_name, connection_url, connection_properties, jar_path)
sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS"
df = pd.read_sql(sql, CONN)

这个版本对我来说太慢了。

您也可以 通过 FreeTDS 使用 pyodbc 。要创建 FreeTDS 连接 在您的 Linux 上安装 apt-get install tdsodbc freetds-bin ,像这样配置 FreeTDS /etc/odbcinst.ini

 [FreeTDS]
Description=FreeTDS
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

并打开它 odbcinst -i -d -f /etc/odbcinst.ini

之后,您可以使用 pyodbc

 import pandas as pd
import pyodbc
CONN =pyodbc.connect('DRIVER={FreeTDS};'
                                  'Server=<server>;'
                                  'Database=<database>;'
                                  'UID=<domain name>\\<username>;'
                                  'PWD=<password>;'
                                  'TDS_Version=8.0;'
                                  'Port=1433;')
sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS"
df = pd.read_sql(sql, CONN)

它的工作速度要快得多

原文由 Nikolai Kamenskiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题