我正在尝试使用 pyodbc 在使用 Docker 托管的 SQL Server 2017 数据库上执行表创建。我还在使用网络,以便以后可以从另一个 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"而不是 localhost 的命令,但无济于事,因为不匹配的主机名似乎是同时使用 DB 和 Docker 时反复出现的主题。也尝试添加sqlexpress
也没有效果。蟒蛇代码如下
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
。这转换为"将主机端口 7000(第一个 7000 - 已发布(映射到容器端口 7000(第二个 7000 - 公开("。如果您在容器内的其他端口上运行 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)