将Docker上的SQL Server连接到Python - python

我试图在使用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>

python大神给出的解决方案

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”进行连接。在这种情况下,本地主机和7000(-p 7000:...的第一部分)不再有效,因为您位于docker管理的网络上。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Python:同时在for循环中添加到列表列表 - python

我想用for循环外的0索引值创建一个新列表,然后使用for循环添加到相同的列表。我的玩具示例是:import random data = ['t1', 't2', 't3'] masterlist = [['col1', 'animal1', 'an…

在Python中迭代OrderedDict - python

我有以下OrderedDict:OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)]) 实际上,这表示单词中字母的出现频率。第一步-我将使用最后两个元素来创建一个这样的联合元组; pair…

如何在Matplotlib条形图后面绘制网格线 - python

x = ['01-02', '02-02', '03-02', '04-02', '05-02'] y = [2, 2, 3, 7, 2] fig, ax = plt.subplots(1, 1) ax.bar(range(len(y)), y, width=…