【问题标题】:How to connect to Microsoft SQL Server from Python code?如何从 Python 代码连接到 Microsoft SQL Server?
【发布时间】:2020-06-19 15:15:32
【问题描述】:

我正在尝试运行 Microsoft SQL Server in Docker 并通过 Python 使用 pyodbc 连接到它。

这是我第一次使用这个数据库,让我抓狂,因为它连续 5 次杀死我的系统,而且我不明白如何配置简单的连接。

我运行数据库的方式:

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=mySecretPassword1234567890' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest

我用这段代码连接:

import pyodbc

conn_str = (
    r"Driver={ODBC Driver 17 for SQL Server};"
    r"Server=127.0.0.1;"
    r"Database=testdb;"
    r"UID=sa;"
    r"PWD=mySecretPassword1234567890;"
    r"Trusted_Connection=yes;"
)
conn = pyodbc.connect(conn_str)

odbcinst详情:

$ odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /Users/dmytro/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

来自 ODBC 驱动程序的调试跟踪:

[ODBC][23857][1592579186.233946][__handles.c][460]
        Exit:[SQL_SUCCESS]
            Environment = 0x7fc1a9973e00
[ODBC][23857][1592579186.233981][SQLSetEnvAttr.c][189]
        Entry:
            Environment = 0x7fc1a9973e00
            Attribute = SQL_ATTR_ODBC_VERSION
            Value = 0x3
            StrLen = 4
[ODBC][23857][1592579186.234005][SQLSetEnvAttr.c][381]
        Exit:[SQL_SUCCESS]
[ODBC][23857][1592579186.234024][SQLAllocHandle.c][377]
        Entry:
            Handle Type = 2
            Input Handle = 0x7fc1a9973e00
[ODBC][23857][1592579186.234044][SQLAllocHandle.c][493]
        Exit:[SQL_SUCCESS]
            Output Handle = 0x7fc1a997ae00
[ODBC][23857][1592579186.234321][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x7fc1a997ae00
            Window Hdl = 0x0
            Str In = [Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=testdb;UID=sa;PWD=mySecretPassword1234567890;Trusted_Connectio...][length = 133 (SQL_NTS)]
            Str Out = 0x0
            Str Out Max = 0
            Str Out Ptr = 0x0
            Completion = 0
        UNICODE Using encoding ASCII 'UTF-8' and UNICODE 'UCS-2-INTERNAL'

[ODBC][23857][1592579186.234896][SQLConnect.c][1138]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found
[ODBC][23857][1592579186.234929][SQLDriverConnect.c][748]
        Entry:
            Connection = 0x7fc1a997ae00
            Window Hdl = 0x0
            Str In = [Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=testdb;UID=sa;PWD=**************************;Trusted_Connection...][length = 133 (SQL_NTS)]
            Str Out = 0x7ffeef507600
            Str Out Max = 2048
            Str Out Ptr = 0x0
            Completion = 0
[ODBC][23857][1592579186.235105][SQLConnect.c][1138]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found
[ODBC][23857][1592579186.235134][SQLGetDiagRecW.c][535]
        Entry:
            Connection = 0x7fc1a997ae00
            Rec Number = 1
            SQLState = 0x7ffeef5099a4
            Native = 0x7ffeef509194
            Message Text = 0x7ffeef5091a0
            Buffer Length = 1023
            Text Len Ptr = 0x7ffeef50919e
[ODBC][23857][1592579186.235160][SQLGetDiagRecW.c][596]
        Exit:[SQL_SUCCESS]
            SQLState = [01000]
            Native = 0x7ffeef509194 -> 0
            Message Text = [[unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found]
[ODBC][23857][1592579186.235205][SQLFreeHandle.c][290]
        Entry:
            Handle Type = 2
            Input Handle = 0x7fc1a997ae00
[ODBC][23857][1592579186.235224][SQLFreeHandle.c][339]
        Exit:[SQL_SUCCESS]

我通读了文档并在 StackOverflow 中搜索了答案,但到目前为止我无法得到它。如何进一步调试?

重要提示:我无法从运行 Microsoft SQL Server 的 Docker 方法切换,也无法切换到其他数据库。

【问题讨论】:

  • 它多次抛出以下错误 > 无法打开 lib 'ODBC Driver 17 for SQL Server' : file not found 并尝试查看可用的 podbc 驱动程序 pyodbc.drivers()
  • @abestrad 它只是空的。这种情况我该怎么办?
  • pip install pyodbc 并再次检查pyodbc.drivers()。它应该显示一个类似 >>> pyodbc.drivers() ['SQL Server', 'Microsoft Access Driver (*.mdb, *.accdb)', 'Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)', 'Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)', 'Microsoft Access Text Driver (*.txt, *.csv)', 'ODBC Driver 13 for SQL Server', 'ODBC Driver 17 for SQL Server', 'SQL Server Native Client 11.0', 'SQL Server Native Client RDA 11.0'] 的列表
  • @abestrad 这正是问题所在,它已安装但我仍然没有得到任何驱动程序。这是pyodbc 中的错误吗?
  • 您是否看到以下任何消息? > Collecting pyodbc > Downloading https://files.pythonhosted.org/packages/........./pyodbc-4.......whl (61kB) > Installing collected packages: pyodbc Successfully installed pyodbc- 这将帮助您跟踪问题。这可能是 pip 而不是 pyodbc 的问题。

标签: python sql-server docker pyodbc


【解决方案1】:

问题出在驱动程序上。 pyodbc.drivers() 返回一个空列表。为了在 Microsoft SQL Server 和 Python 之间进行通信,您需要额外的 ODBC driver layer

感谢@abestrad 指出这一点。

【讨论】:

    【解决方案2】:

    试试这个:

    import pyodbc
    
    conn_str = (
        r"Driver={ODBC Driver 17 for SQL Server};"
        r"Server=host.docker.internal;"
        r"Database=testdb;"
        r"UID=sa;"
        r"PWD=mySecretPassword1234567890;"
        r"Trusted_Connection=yes;"
    )
    conn = pyodbc.connect(conn_str)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多