实验系统环境
Windows平台
Sqlalchemy 2.0.23
Python 3.10
SQL Server 2012
aioodbc 0.5.0
问题详情
sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('28000', '[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。 (18452) (SQLDriverConnect); [28000] [Microsoft][ODBC Driver 17 for SQL Server]无效的连接字符串属性 (0); [28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。 (18452); [28000] [Microsoft][ODBC Driver 17 for SQL Server]无效的连接字符串属性 (0)')
官方写法
SQLAlchemy 2.0 文档中通过 aioodbc 驱动程序支持 Microsoft SQL Server 数据库。
注意:要求 SQLAlchemy版本V2.0.23+,否则会报错找不到插件
“Can't load plugin: sqlalchemy.dialects:aioodbc”
点击查看代码
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine(
"mssql+aioodbc://scott:tiger@mssql2017:1433/test?"
"driver=ODBC+Driver+17+for+SQL+Server&TrustServerCertificate=yes"
)
解决方案
1、环境依赖:
1)确认Sqlserver连接配置的ODBC驱动已安装
查看 控制面板\系统和安全\管理工具 ==>> 点击查看 ODBC数据源\驱动程序 ,验证是否有ODBC驱动:
通常系统默认自带名为SQL Server的驱动,所以按理说driver='SQL+Server'应该是OK的。但实际在使用中不行!!!所以还是需要安装ODBC启动。
如 “ODBC Driver 17 for SQL Server”或以后版本
如果没有,官方下载 Version 17 路径:https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15 或以上版本
2、增加 “IntegratedSecurity=false”
示例如下:
点击查看代码
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine(
"mssql+aioodbc://scott:tiger@mssql2017:1433/test?"
"driver=ODBC+Driver+17+for+SQL+Server&TrustServerCertificate=yes&IntegratedSecurity=false"
)
解释一下:
1)IntegratedSecurity
集成安全性为true时,意味着使用windows凭据对Server进行登录验证,它将自动与windows登录和密码一起被重写。因此,如果登录到另一个域控制器,那么它将失败。
当集成安全性为false时,Server将使用连接字符串中提供的Server登录名和密码。为此,Server实例必须将其身份验证模式配置为混合模式,即Server和Windows身份验证模式。
2)Trusted_Connection
可信任连接,一开始我设置的是Trusted_Connection=True,主要是使用本地数据库调试使用,设置Trusted_Connection=true,意味着将使用windows凭证验证用户,设不设密码都能访问。但这就涉及到一个安全问题了。所以交付一定要设置Trusted_Connection=false使用用户名和密码验证登陆,以防被别人"登录"、"注入语句"等。
通用写法
点击查看代码
from sqlalchemy.ext.asyncio import create_async_engine
SQLALCHEMY_DATABASE_URL = (f"mssql+aioodbc://{SQLSERVER_USER}:{SQLSERVER_PASSWORD}@{SQLSERVER_HOST}:{SQLSERVER_PORT}/{SQLSERVER_DATABASE}?"
f"driver={SQLSERVER_DRIVER}&TrustServerCertificate=yes&IntegratedSecurity=false")
engine = create_async_engine(SQLALCHEMY_DATABASE_URL)
参考
1、https://docs.sqlalchemy.org.cn/en/20/dialects/mssql.html#module-sqlalchemy.dialects.mssql.aioodbc
2、https://cloud.tencent.com/developer/ask/sof/110044375