当前位置:首页>python>Python 操作 SQL Server,看这篇就够了

Python 操作 SQL Server,看这篇就够了

  • 2026-09-21 21:20:22
Python 操作 SQL Server,看这篇就够了

📌 适合人群:上一篇《Python 操作数据库》的读者,补充 SQL Server 内容📌 你将学到:pyodbc 和 pymssql 两种方式操作 SQL Server📌 阅读时间:8 分钟


上篇《Python 操作数据库,这一篇就够了》发出来后,不少读者问:

"怎么没有 SQL Server?我们公司用的就是 SQL Server!"

确实,SQL Server 在企业环境里占有率极高——银行、制造业、政府系统、传统企业……到处都是它的身影。

这一篇单独补上,而且还是同一个用户管理的案例,方便和上篇的 MySQL / PostgreSQL 横向对比。


一、连接 SQL Server 的两种方式

Python 连接 SQL Server 有两条路:

方式
推荐度
特点
pyodbc
 ⭐
强烈推荐
微软官方推荐,功能全,性能好
pymssql
备选
轻量、不依赖 ODBC 驱动,但更新较慢

新手建议直接用 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 的 ? 区分。


五、和上篇其他数据库的语法对比

操作
SQL Server
MySQL
PostgreSQL
SQLite
自增列
IDENTITY(1,1)AUTO_INCREMENTSERIALAUTOINCREMENT
字符串
NVARCHAR
(支持中文)
VARCHARVARCHARTEXT
占位符(原生)
?
(pyodbc)/ %s(pymssql)
%s%s?
分页
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLYLIMIT 10 OFFSET 0LIMIT 10 OFFSET 0LIMIT 10 OFFSET 0
Python 库
pyodbc
 / pymssql
pymysqlpsycopg2sqlite3
(内置)
需要装驱动
✅ 要装 ODBC
❌ 不用
❌ 不用
❌ 不用

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
 + mssql+pyodbc://
最大的坑
忘记装 ODBC 驱动
最好的消息
CRUD 代码和 MySQL / PostgreSQL 基本一致

💡 如果你是新手,先用 pymssql 上手,它不需要任何额外配置,装好就能跑。跑通了再换 pyodbc 上生产环境。


📝 本篇是上篇的补充番外篇 🎉

现在 Python 操作数据库系列已覆盖:SQLite · MySQL · PostgreSQL · MongoDB · Redis · SQL Server

关注我,更多 Python 实战干货持续更新 🚀

最新文章

随机文章