📌 适合人群:上一篇《Python 操作数据库》的读者,补充 SQL Server 内容📌 你将学到:pyodbc 和 pymssql 两种方式操作 SQL Server📌 阅读时间:8 分钟
上篇《Python 操作数据库,这一篇就够了》发出来后,不少读者问:
"怎么没有 SQL Server?我们公司用的就是 SQL Server!"
确实,SQL Server 在企业环境里占有率极高——银行、制造业、政府系统、传统企业……到处都是它的身影。
这一篇单独补上,而且还是同一个用户管理的案例,方便和上篇的 MySQL / PostgreSQL 横向对比。
一、连接 SQL Server 的两种方式
Python 连接 SQL Server 有两条路:
新手建议直接用 pyodbc,这是微软官方推荐的方案,文档最全、社区最活跃。
二、安装前的准备
2.1 安装 Python 库
# 方式一:pyodbc(推荐)pip install pyodbc# 方式二:pymssql(备选)pip install pymssql
2.2 安装 ODBC 驱动(用 pyodbc 必须装)
pyodbc 需要系统里装了 SQL Server 的 ODBC 驱动才能工作。
Windows 用户(最简单):
一般 Windows 自带 SQL Server ODBC 驱动,如果连接报错,去微软官网搜 "ODBC Driver for SQL Server" 下载安装即可。
Mac 用户:
brew install unixodbcbrew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-releasebrew install msodbcsql17
Linux 用户(Ubuntu / Debian):
# 安装 ODBC 驱动curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.listapt-get updateACCEPT_EULA=Y apt-get install -y msodbcsql18# 安装 unixODBCapt-get install -y unixodbc-dev
⚠️ 新手最容易踩的坑:只装了 pyodbc,没装 ODBC 驱动,连上就会报错。
三、pyodbc 方式(推荐 💪)
3.1 连接数据库
import pyodbc# 连接字符串conn_str = ( 'DRIVER={ODBC Driver 18 for SQL Server};' # 驱动名 'SERVER=localhost;' # 服务器地址 'DATABASE=testdb;' # 数据库名 'UID=sa;' # 用户名 'PWD=123456;' # 密码 'TrustServerCertificate=yes;' # 信任自签名证书)conn = pyodbc.connect(conn_str)cursor = conn.cursor()print("✅ SQL Server 连接成功!")
💡 重要参数说明:
- •
SERVER:如果是本机写 localhost,远程写 IP 或域名 - •
DATABASE:要连接的数据库名,需提前在 SQL Server 里创建好 - •
TrustServerCertificate=yes:开发环境用,避免 SSL 证书校验报错
3.2 创建表
cursor.execute(''' CREATE TABLE users ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50) NOT NULL, age INT, city NVARCHAR(50) )''')conn.commit()print("✅ 表创建成功")
💡 注意 SQL Server 的语法特点:
- • 自增是
IDENTITY(1,1),不是 MySQL 的 AUTO_INCREMENT - • 字符串类型用
NVARCHAR 支持中文,VARCHAR 可能乱码
3.3 增删改查
# ---------- 新增 ----------cursor.execute( "INSERT INTO users (name, age, city) VALUES (?, ?, ?)", ('张三', 25, '北京'))cursor.executemany( "INSERT INTO users (name, age, city) VALUES (?, ?, ?)", [ ('李四', 30, '上海'), ('王五', 28, '广州'), ('赵六', 22, '深圳'), ])conn.commit()print("✅ 新增成功")# ---------- 查询 ----------cursor.execute("SELECT * FROM users")rows = cursor.fetchall()for row in rows: print(f" ID: {row.id}, 姓名: {row.name}, 年龄: {row.age}, 城市: {row.city}")# 条件查询cursor.execute("SELECT * FROM users WHERE city = ?", ('上海',))for row in cursor.fetchall(): print(f" 上海用户: {row.name}")# ---------- 更新 ----------cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, '张三'))conn.commit()print(f"✅ 更新成功,影响 {cursor.rowcount} 行")# ---------- 删除 ----------cursor.execute("DELETE FROM users WHERE name = ?", ('赵六',))conn.commit()print(f"✅ 删除成功,影响 {cursor.rowcount} 行")# ---------- 关闭 ----------cursor.close()conn.close()
🎯 注意:pyodbc 的占位符是 ?(和 SQLite 一样),不是 MySQL 的 %s。而且 pyodbc 默认就能用 row.列名 的方式访问数据,比元组索引更清晰。
四、pymssql 方式(轻量备选)
如果你不想折腾 ODBC 驱动,pymssql 可以直接连,不需要额外安装任何驱动。
import pymssql# 连接conn = pymssql.connect( server='localhost', user='sa', password='123456', database='testdb', charset='utf8' # 确保中文不乱码)cursor = conn.cursor()# 创建表cursor.execute(''' CREATE TABLE users ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50) NOT NULL, age INT, city NVARCHAR(50) )''')conn.commit()# 增删改查(和 pyodbc 几乎一样)cursor.execute("INSERT INTO users (name, age, city) VALUES (%s, %s, %s)", ('张三', 25, '北京'))conn.commit()cursor.execute("SELECT * FROM users")for row in cursor.fetchall(): print(f" ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}, 城市: {row[3]}")cursor.close()conn.close()
⚠️ pymssql 的占位符是 %s(和 MySQL 一样),注意和 pyodbc 的 ? 区分。
五、和上篇其他数据库的语法对比
| | | | |
|---|
| IDENTITY(1,1) | AUTO_INCREMENT | SERIAL | AUTOINCREMENT |
| NVARCHAR | VARCHAR | VARCHAR | TEXT |
| ? | %s | %s | ? |
| OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY | LIMIT 10 OFFSET 0 | LIMIT 10 OFFSET 0 | LIMIT 10 OFFSET 0 |
| pyodbc | pymysql | psycopg2 | sqlite3 |
| | | | |
SQL Server 最大的门槛就是装 ODBC 驱动这一步,装好了后面就一路顺畅。
六、常见问题
❌ 连接报错 "Data source name not found"
原因:没装 ODBC 驱动解决:按本文第二章安装 ODBC Driver for SQL Server
❌ 连接报错 "Cannot open database"
原因:数据库还不存在解决:先在 SQL Server 里 CREATE DATABASE testdb
-- 如果还没建数据库,先在 SQL Server 里执行CREATE DATABASE testdb;
❌ 中文变成问号 "???"
# pyodbc 连接字符串加 charsetconn_str += ';charset=utf8'# pymssql 连接时指定conn = pymssql.connect(..., charset='utf8')# 建表用 NVARCHAR 替代 VARCHAR
❌ pyodbc 还是 pymssql?
你的环境 → 推荐Windows + 有 ODBC 驱动 → pyodbc ✅ 首选不想装 ODBC 驱动 → pymssql公司 SQL Server 版本较老 → pymssql 兼容性更好
七、完整示例脚本
"""SQL Server 操作完整示例安装:pip install pyodbc需要先安装 ODBC Driver for SQL Server"""import pyodbc# 1. 连接conn_str = ( 'DRIVER={ODBC Driver 18 for SQL Server};' 'SERVER=localhost;' 'DATABASE=testdb;' 'UID=sa;' 'PWD=123456;' 'TrustServerCertificate=yes;')conn = pyodbc.connect(conn_str)cursor = conn.cursor()print("✅ 连接成功")# 2. 建表cursor.execute(''' IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='users' AND xtype='U') CREATE TABLE users ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50) NOT NULL, age INT, city NVARCHAR(50) )''')conn.commit()print("✅ 建表成功")# 3. 新增cursor.execute("INSERT INTO users (name, age, city) VALUES (?, ?, ?)", ('张三', 25, '北京'))cursor.executemany("INSERT INTO users (name, age, city) VALUES (?, ?, ?)", [ ('李四', 30, '上海'), ('王五', 28, '广州'),])conn.commit()print("✅ 新增成功")# 4. 查询cursor.execute("SELECT * FROM users")print("\n📋 用户列表:")for row in cursor.fetchall(): print(f" {row.id}. {row.name} | {row.age}岁 | {row.city}")# 5. 更新cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, '张三'))conn.commit()print(f"\n✅ 更新成功,影响 {cursor.rowcount} 行")# 6. 删除cursor.execute("DELETE FROM users WHERE name = ?", ('王五',))conn.commit()print(f"✅ 删除成功,影响 {cursor.rowcount} 行")# 7. 关闭cursor.close()conn.close()print("\n✅ 全部操作完成!")
总结
| |
|---|
| 推荐方案 | pyodbc + ODBC Driver for SQL Server |
| 轻量方案 | pymssql |
| ORM 方案 | SQLAlchemy |
| 最大的坑 | |
| 最好的消息 | CRUD 代码和 MySQL / PostgreSQL 基本一致 |
💡 如果你是新手,先用 pymssql 上手,它不需要任何额外配置,装好就能跑。跑通了再换 pyodbc 上生产环境。
📝 本篇是上篇的补充番外篇 🎉
现在 Python 操作数据库系列已覆盖:SQLite · MySQL · PostgreSQL · MongoDB · Redis · SQL Server
关注我,更多 Python 实战干货持续更新 🚀