将 Docker 上的 SQL Server 连接到 Python



我正在尝试使用 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)

相关内容

  • 没有找到相关文章

最新更新