无法通过Python连接AWS MSSQL数据库,寻求解决方案
解决Python连接AWS RDS MSSQL数据库的驱动问题
从你给出的三种报错信息来看,核心问题都是unixODBC驱动管理器找不到对应的MSSQL ODBC驱动——不管是你指定的SQL SERVER/SQL Server驱动名称不对,还是没指定驱动时默认找不到数据源,本质都是系统里没装正确的ODBC驱动,或者驱动名称写错了。毕竟你能在SQL IDE里正常连接,说明网络、数据库权限、账号密码都是没问题的,问题就出在Python依赖的ODBC驱动上。
我给你一步步梳理解决方案:
1. 先安装微软官方的MSSQL ODBC驱动
因为你是在类Unix环境(Linux/macOS)下运行代码,必须安装微软官方提供的ODBC驱动,而不是系统默认的驱动。
对于Linux(以Ubuntu为例):
# 导入微软GPG密钥 curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # 添加微软SQL Server软件源 curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list # 更新包列表并安装驱动和unixODBC开发包 sudo apt-get update sudo apt-get install -y msodbcsql17 unixodbc-dev
如果是其他发行版(比如CentOS),可以找对应版本的安装命令,核心是装msodbcsql17或更高版本的驱动。
对于macOS:
用Homebrew直接安装:
brew install msodbcsql17 mssql-tools
2. 确认正确的驱动名称
安装完成后,执行odbcinst -j命令查看系统ODBC配置路径,打开对应路径下的odbcinst.ini文件,你会看到MSSQL驱动的官方名称,通常是ODBC Driver 17 for SQL Server——这是当前推荐的最新驱动名称,你之前用的SQL SERVER是旧版驱动的名称,现在已经不再适配。
3. 修改代码使用正确的驱动
方法一(pyodbc直接连接)
import pyodbc server = 'mssqlins.abcdefghklmn.us-north-2.rds.amazonaws.com' database = 'database' username = '你的数据库用户名' # 替换成实际账号 password = '你的数据库密码' # 替换成实际密码 # 用正确的驱动名称构建连接字符串 conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' try: conn = pyodbc.connect(conn_str) cursor = conn.cursor() sql = """SELECT * FROM dbo.member;""" cursor.execute(sql) # 读取示例数据 rows = cursor.fetchall() for row in rows: print(row) except Exception as e: print(f"连接出错: {e}") finally: if conn: conn.close()
方法二(SQLAlchemy + pandas)
import pandas as pd from sqlalchemy import create_engine import urllib.parse server = 'mssqlins.abcdefghklmn.us-north-2.rds.amazonaws.com' db = 'database' username = '你的数据库用户名' password = '你的数据库密码' # 注意用+替换驱动名称里的空格 driver = 'ODBC+Driver+17+for+SQL+Server' # 如果密码里有特殊字符(比如@、&),需要URL编码 encoded_password = urllib.parse.quote_plus(password) # 构建SQLAlchemy连接字符串 engine = create_engine(f'mssql+pyodbc://{username}:{encoded_password}@{server}/{db}?driver={driver}') myQuery = '''SELECT * FROM deneme''' try: df = pd.read_sql_query(myQuery, engine) print(df.head()) except Exception as e: print(f"查询出错: {e}")
额外注意点
- 如果你用的是IAM身份认证连接RDS MSSQL,需要额外生成临时凭证,但你这里用的是账号密码,暂时不用考虑。
- 确认你的机器安全组已经开放RDS的1433端口(你能在IDE里连接,这个应该没问题,但可以再核对下)。
内容的提问来源于stack exchange,提问作者Axis
相关产品推荐
相关产品推荐

