You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyodbc.connect无法通过创建的登录名和用户连接SQL Server

无法通过pyodbc连接Docker部署的SQL Server(登录失败错误18456)

被这个问题卡了好几天,翻了一堆Stack Overflow帖子和Microsoft、pyodbc官方文档都没解决,应该是有特殊细节没注意到,求帮忙。

目标

用Python脚本通过pyodbc连接Docker部署的SQL Server。已编写docker-compose.yml,基于Dockerfile构建镜像,自动执行setup.sql脚本创建数据库、用户及登录名,避免每次启动容器时重复操作。

本地环境与连接代码

本地已安装ODBC Driver 17 for SQL Server(通过ODBC数据源管理器确认),使用以下代码连接:

cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=kafkaUser;PWD=Kafka_Us3R!;')

注:试过trusted_connection=yes;无效。无论使用sa、kafkaUser还是kafkaLogin及对应密码,都会报错,上述是最后一次尝试的代码。

Dockerfile内容

FROM mcr.microsoft.com/mssql/server
WORKDIR /topics

# Env vars for sql server
ENV ACCEPT_EULA Y
ENV MSSQL_SA_PASSWORD <YourStrong!Passw0rd>
ENV MSSQL_PID Developer
ENV MSSQL_HOST localhost
ENV MSSQL_USER kafkaUser
ENV MSSQL_PASSWORD Kafka_Us3R!
ENV MSSQL_DATABASE testdb

EXPOSE 1433:1433

COPY topics/proposal-created-hl/setup.sql setup.sql
COPY topics/proposal-created-hl/setup_database.sh setup_database.sh
COPY topics/proposal-created-hl/entrypoint.sh entrypoint.sh

RUN /opt/mssql/bin/sqlservr & ./setup_database.sh

setup.sql内容

-- MSSQL file for local testing with docker container
IF NOT EXISTS ( SELECT * FROM sys.databases WHERE name = 'testdb' )
    CREATE DATABASE [testdb];
GO

USE [testdb]
GO

IF NOT EXISTS ( SELECT name FROM sys.server_principals WHERE name = 'kafkaLogin' )
    BEGIN
        CREATE LOGIN [kafkaLogin] WITH PASSWORD = 'Kafka_Us3R!', CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF;
        ALTER SERVER ROLE [sysadmin] ADD MEMBER [kafkaLogin];
        ALTER LOGIN [kafkaLogin] WITH DEFAULT_DATABASE = [testdb];
        CREATE USER [kafkaUser] FOR LOGIN [kafkaLogin];
    END
GO

报错信息

pyodbc.InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'kafkaUser'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'kafkaUser'. (18456)")

setup_database.sh内容

#!/usr/bin/env bash
# Wait for database to startup 
sleep 20
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourStrong!Passw0rd>' -i setup.sql

已做排查

通过docker exec进入容器确认数据库、用户及登录名已创建,但仍无法连接,尝试多种常见方案均无效,请问遗漏了哪些细节?

内容的提问来源于stack exchange,提问作者pragmatic learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:35:25