将 Docker 上的 SQL 服务器连接到 Python

Connecting SQL Server on Docker to Python

我正在尝试在使用 Docker 托管的 SQL Server 2017 数据库上使用 pyodbc 执行 table 创建。我也在使用网络,以便稍后可以从另一个 Docker 图像连接到它。但是,我收到以下错误

pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

这就是我创建连接的方式。

要创建和 运行 数据库服务器,

docker run --name mssqldocker -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<password>' -e 'MSSQL_PID=Express' -p 7000:7000 --network=lambda-local-mssql -v <my_path> -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

我也试过添加

-h "mssqldocker"

到 运行 宁 Docker 图像的命令,然后使用 "mssqldocker" 而不是本地主机,但无济于事,因为不匹配的主机名似乎是使用时反复出现的主题DB 和 Docker 在一起。还尝试添加 \sqlexpress 也没有效果。 Python代码如下

import pyodbc
import sql_clauses
from settings import ENDPOINT, PORT, USERNAME, PASSWORD

cnxn = pyodbc.connect(
       'DRIVER={ODBC Driver 17 for SQL Server}' + 
       ';SERVER=' + ENDPOINT + ';UID=' + USERNAME + 
       ';PWD=' + PASSWORD)

cursor = db.cursor()
cursor.execute(create_database(dbname))
cnxn.commit()
cnxn.close()
print("Database created")

设置文件如下

ENDPOINT="localhost"
PORT = 7000
USERNAME="SA"
PASSWORD=<password>

在您的 docker run 命令中指定 -p 7000:7000。这翻译成 "map the host port 7000 (first 7000 - published) to the container port 7000 (the second 7000 - exposed)"。如果您在容器内的不同端口上有 MSSQL 运行(您可能这样做),那么您必须将第二个 7000 更改为正确的端口。

完成后,您应该能够使用 "localhost:7000" 从主机连接到 MSSQL。如果您的 python 应用程序直接 在主机 上运行,这适用。

如果您的 python 项目也 在容器中运行 ,您需要确保它与 mssql 容器在同一网络上运行 (--network=lambda-local-mssql ) 然后您需要使用 "mssqldocker:mssql_exposed_port" 进行连接。在这种情况下,localhost 和 7000(`-p 7000:... 的第一部分)不再有效,因为您在 docker 托管网络上。

问题中的示例代码不完整,使用了未定义的变量。

一个非常简单的工作示例是:

# docker compose file
version: "3.9"
services:
    <Some name>:
        image: mcr.microsoft.com/mssql/server:2019-latest # Or whatever version you want
        container_name: <Some name>
        restart: unless-stopped
        ports:
            - "1433:1433"
        environment:
            - ACCEPT_EULA=Y
            - SA_PASSWORD=<Some Password>
            - MSSQL_PID=Developer
            - MSSQL_AGENT_ENABLED=True
import pandas as pd
import pyodbc

cnxn = pyodbc.connect(
       'DRIVER={ODBC Driver 17 for SQL Server}' + 
       ';SERVER=' + 'localhost,1433' + ';UID=' + 'sa' + 
       ';PWD=' + '<Some password' +
       ';database=<some DB name>') # database here is optional if you want to specify it below in the query.

df = pd.read_sql('some query like select * from table', cnxn)

cnxn.commit()
cnxn.close()

print(df)