【问题标题】:Connecting SQL Server on Docker to Python将 Docker 上的 SQL Server 连接到 Python
【发布时间】:2020-02-14 07:06:01
【问题描述】:

我正在尝试在使用 Docker 托管的 SQL Server 2017 数据库上使用 pyodbc 创建表。我也在使用网络,以便以后可以从另一个 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 也没有效果。 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>

【问题讨论】:

  • Sql server 默认使用 1433 端口,尝试使用 7000 代替(在你的 python 代码和运行 docker 镜像的命令中)
  • 是的,完成了这项工作。

标签: python sql-server docker pyodbc


【解决方案1】:

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 管理的网络上。

【讨论】:

  • 我认为您使用的是 MYSQL 而不是 SQL Server。 MySQL 的默认端口为 3306。
【解决方案2】:

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

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

# 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)

【讨论】:

  • 嗨,David,您的 python 程序是如何使用 docker compose 文件的?它如何检测到 docker compose 文件存在?我看不到两者之间的联系。
  • 我没有把两者联系起来。 Docker Compose 为数据库运行 docker,然后 python 使用硬编码值连接到它。我没有解析 docker compose 来自动注入这些值或数据库的状态。
  • 我了解大卫。谢谢你解释。另外,你是怎么知道司机的名字的?我的 docker 容器设置方式与包含相同图像的方式相同,但在运行程序时出现“找不到文件 (0) 无法打开 lib 'ODBC Driver 17 for SQL Server'”错误。然而,我成功地能够访问 Azure Data Studio 上的服务器,只是还没有在 python 上。
  • 在 Windows 中(如果您正在使用它) - 您可以通过打开 ODBC 数据源管理器(64 位)来检查哪些驱动程序。
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多