如何从 Python 代码连接到 Microsoft SQL 服务器?
How to connect to Microsoft SQL Server from Python code?
我正在尝试 运行 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]
我通读了文档并在 Whosebug 中搜索了答案,但到目前为止我无法得到它。我怎样才能进一步调试它?
重要提示:我无法从 运行ning Microsoft SQL 服务器的 Docker 方法切换,我也无法切换到不同的数据库。
试试这个:
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)
原来问题出在驱动程序上。 pyodbc.drivers()
返回了一个空列表。为了在 Microosft SQL 服务器和 Python 之间进行通信,您需要额外的 ODBC driver layer
感谢@abestrad 指出了这一点。
我正在尝试 运行 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]
我通读了文档并在 Whosebug 中搜索了答案,但到目前为止我无法得到它。我怎样才能进一步调试它?
重要提示:我无法从 运行ning Microsoft SQL 服务器的 Docker 方法切换,我也无法切换到不同的数据库。
试试这个:
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)
原来问题出在驱动程序上。 pyodbc.drivers()
返回了一个空列表。为了在 Microosft SQL 服务器和 Python 之间进行通信,您需要额外的 ODBC driver layer
感谢@abestrad 指出了这一点。