Python3.8对SQL Server 2016增删改查教程(小白版)
Python3.8对SQL Server 2016增删改查教程(小白版)
前言
欢迎阅读本教程!这是一篇专为零基础或初学者编写的Python操作SQL Server数据库的入门指南。在日常工作和学习中,我们经常需要用编程语言来操作数据库,本文将详细介绍如何使用Python 3.8来连接SQL Server 2016,并进行增删改查(CRUD)操作。
本文档将包括以下内容:
- 准备工作(安装必要的软件和库)
- Python连接SQL Server数据库
- 执行查询操作(SELECT)
- 执行插入操作(INSERT)
- 执行更新操作(UPDATE)
- 执行删除操作(DELETE)
- 事务处理
- 常见问题与解决方案
让我们开始吧!
一、准备工作
1. 确保已安装SQL Server 2016
在开始之前,确保你已经安装了SQL Server 2016。如果你还没有安装,可以从微软官方网站下载并安装。
2. 安装Python 3.8
确保你的电脑上安装了Python 3.8版本。你可以从Python官方网站(https://www.python.org/)下载并安装。安装时记得勾选"Add Python 3.8 to PATH"选项。
安装完成后,可以在命令提示符中输入以下命令验证安装是否成功:
python --version
如果安装成功,会显示Python 3.8.x的版本信息。
3. 安装pyodbc库
Python需要使用pyodbc库来连接SQL Server数据库。在命令提示符中输入以下命令进行安装:
pip install pyodbc
安装完成后,可以在Python交互式环境中输入以下命令验证安装是否成功:
import pyodbc
print(pyodbc.version)
如果安装成功,会显示pyodbc的版本信息。
二、Python连接SQL Server数据库
1. 了解连接字符串
连接SQL Server数据库需要一个连接字符串,它包含了连接数据库所需的信息,如服务器地址、数据库名称、用户名、密码等。
一个基本的连接字符串格式如下:
DRIVER={ODBC Driver 17 for SQL Server};SERVER=服务器地址;DATABASE=数据库名;UID=用户名;PWD=密码
注意:这里使用的是ODBC Driver 17,你需要根据实际安装的驱动版本进行调整,可能是13、17或18等。
2. 测试连接
下面是一个简单的测试连接的示例代码:
import pyodbcdef test_connection():try:# 构建连接字符串conn_str = (r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost; # 服务器地址,本地可以用localhost或.DATABASE=master; # 数据库名称,这里使用master数据库进行测试UID=sa; # 用户名PWD=YourPassword" # 密码)# 连接数据库conn = pyodbc.connect(conn_str)print("连接成功!")# 关闭连接conn.close()except Exception as e:print(f"连接失败: {e}")# 执行测试
if __name__ == "__main__":test_connection()
请根据你实际的SQL Server配置修改上述代码中的服务器地址、用户名和密码。
3. 常见的连接错误及解决方法
-
驱动问题:如果提示找不到驱动,请检查你安装的ODBC驱动版本,并修改连接字符串中的DRIVER部分。
- 可以在"控制面板 > 管理工具 > ODBC数据源(64位)"中查看已安装的驱动。
-
认证问题:如果提示登录失败,请检查用户名和密码是否正确。
- 也可以使用Windows身份验证模式连接:
conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes"
- 也可以使用Windows身份验证模式连接:
三、执行查询操作(SELECT)
查询是数据库操作中最常用的操作之一,下面我们来看如何使用Python从SQL Server查询数据。
1. 基本查询示例
import pyodbcdef select_data():try:# 连接数据库conn_str = (r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes" # 使用Windows身份验证)conn = pyodbc.connect(conn_str)# 创建游标cursor = conn.cursor()# 执行SQL查询cursor.execute("SELECT name, database_id, create_date FROM sys.databases")# 获取查询结果rows = cursor.fetchall()# 打印查询结果for row in rows:print(f"数据库名称: {row.name}, ID: {row.database_id}, 创建时间: {row.create_date}")# 关闭游标和连接cursor.close()conn.close()except Exception as e:print(f"查询失败: {e}")# 执行查询
if __name__ == "__main__":select_data()
2. 参数化查询
为了防止SQL注入攻击,我们应该使用参数化查询:
import pyodbcdef parameterized_query():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 参数化查询database_name = "tempdb"cursor.execute("SELECT name, database_id, create_date FROM sys.databases WHERE name = ?", database_name)# 获取单行结果row = cursor.fetchone()if row:print(f"找到数据库: {row.name}")else:print("未找到指定数据库")cursor.close()conn.close()except Exception as e:print(f"查询失败: {e}")if __name__ == "__main__":parameterized_query()
四、执行插入操作(INSERT)
1. 创建测试数据库和表
在进行插入操作之前,我们先创建一个测试数据库和表:
import pyodbcdef create_test_table():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 创建测试数据库cursor.execute("CREATE DATABASE PythonTestDB")print("数据库创建成功")# 切换到新创建的数据库conn.close()conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 创建测试表cursor.execute('''CREATE TABLE Users (ID INT PRIMARY KEY IDENTITY(1,1),Name NVARCHAR(50) NOT NULL,Age INT,Email NVARCHAR(100))''')print("表创建成功")# 提交事务conn.commit()cursor.close()conn.close()except Exception as e:print(f"创建失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":create_test_table()
2. 插入单条数据
import pyodbcdef insert_single_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 插入单条数据name = "张三"age = 28email = "zhangsan@example.com"cursor.execute("INSERT INTO Users (Name, Age, Email) VALUES (?, ?, ?)", (name, age, email))# 提交事务conn.commit()print("数据插入成功")cursor.close()conn.close()except Exception as e:print(f"插入失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":insert_single_data()
3. 批量插入数据
import pyodbcdef insert_batch_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 批量插入数据users = [("李四", 32, "lisi@example.com"),("王五", 45, "wangwu@example.com"),("赵六", 27, "zhaoliu@example.com")]cursor.executemany("INSERT INTO Users (Name, Age, Email) VALUES (?, ?, ?)", users)# 提交事务conn.commit()print(f"批量插入成功,共插入 {cursor.rowcount} 条数据")cursor.close()conn.close()except Exception as e:print(f"批量插入失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":insert_batch_data()
五、执行更新操作(UPDATE)
1. 更新单条数据
import pyodbcdef update_single_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 更新单条数据new_age = 29user_id = 1cursor.execute("UPDATE Users SET Age = ? WHERE ID = ?", (new_age, user_id))# 提交事务conn.commit()if cursor.rowcount > 0:print(f"更新成功,影响了 {cursor.rowcount} 条记录")else:print("未找到要更新的记录")cursor.close()conn.close()except Exception as e:print(f"更新失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":update_single_data()
2. 更新多条数据
import pyodbcdef update_multiple_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 更新多条数据new_email_suffix = "@company.com"min_age = 30cursor.execute("UPDATE Users SET Email = CONCAT(LEFT(Email, CHARINDEX('@', Email) - 1), ?) WHERE Age >= ?", (new_email_suffix, min_age))# 提交事务conn.commit()print(f"批量更新成功,影响了 {cursor.rowcount} 条记录")cursor.close()conn.close()except Exception as e:print(f"批量更新失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":update_multiple_data()
六、执行删除操作(DELETE)
1. 删除单条数据
import pyodbcdef delete_single_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 删除单条数据user_id = 2cursor.execute("DELETE FROM Users WHERE ID = ?", user_id)# 提交事务conn.commit()if cursor.rowcount > 0:print(f"删除成功,影响了 {cursor.rowcount} 条记录")else:print("未找到要删除的记录")cursor.close()conn.close()except Exception as e:print(f"删除失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":delete_single_data()
2. 删除多条数据
import pyodbcdef delete_multiple_data():try:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 删除多条数据max_age = 30cursor.execute("DELETE FROM Users WHERE Age <= ?", max_age)# 提交事务conn.commit()print(f"批量删除成功,影响了 {cursor.rowcount} 条记录")cursor.close()conn.close()except Exception as e:print(f"批量删除失败: {e}")# 发生错误时回滚事务if 'conn' in locals():conn.rollback()if __name__ == "__main__":delete_multiple_data()
七、事务处理
事务是数据库操作的一个重要概念,它确保一组操作要么全部成功,要么全部失败,从而保证数据的一致性。
1. 事务的四个特性(ACID)
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败
- 一致性(Consistency):事务执行前后,数据库从一个一致性状态转变为另一个一致性状态
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行
- 持久性(Durability):事务一旦提交,其结果应该永久保存在数据库中
2. Python中的事务处理
import pyodbcdef transaction_example():conn = Nonetry:conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"conn = pyodbc.connect(conn_str)# 开始事务(默认自动开始)cursor = conn.cursor()# 执行多个操作# 1. 插入一条记录cursor.execute("INSERT INTO Users (Name, Age, Email) VALUES (?, ?, ?)", ("小明", 22, "xiaoming@example.com"))# 2. 更新一条记录cursor.execute("UPDATE Users SET Age = ? WHERE Name = ?", (33, "王五"))# 3. 查询结果cursor.execute("SELECT COUNT(*) FROM Users")count = cursor.fetchone()[0]print(f"当前用户总数: {count}")# 提交事务conn.commit()print("事务提交成功")except Exception as e:print(f"事务执行失败: {e}")# 发生错误时回滚事务if conn:conn.rollback()print("事务已回滚")finally:# 确保关闭连接if conn:conn.close()if __name__ == "__main__":transaction_example()
八、综合示例:用户管理系统
下面是一个简单的用户管理系统示例,它结合了我们前面所学的增删改查操作:
import pyodbcdef connect_db():"""连接数据库"""conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=PythonTestDB;Trusted_Connection=yes"return pyodbc.connect(conn_str)def add_user(name, age, email):"""添加用户"""try:conn = connect_db()cursor = conn.cursor()cursor.execute("INSERT INTO Users (Name, Age, Email) VALUES (?, ?, ?)", (name, age, email))conn.commit()print(f"用户 {name} 添加成功")except Exception as e:print(f"添加用户失败: {e}")if 'conn' in locals():conn.rollback()finally:if 'conn' in locals():conn.close()def list_users():"""列出所有用户"""try:conn = connect_db()cursor = conn.cursor()cursor.execute("SELECT ID, Name, Age, Email FROM Users")users = cursor.fetchall()if not users:print("暂无用户数据")returnprint("\n用户列表:")print("-" * 80)print(f"{'ID':<5} {'姓名':<10} {'年龄':<5} {'邮箱':<30}")print("-" * 80)for user in users:print(f"{user.ID:<5} {user.Name:<10} {user.Age:<5} {user.Email:<30}")print("-" * 80)except Exception as e:print(f"获取用户列表失败: {e}")finally:if 'conn' in locals():conn.close()def update_user(user_id, name=None, age=None, email=None):"""更新用户信息"""try:conn = connect_db()cursor = conn.cursor()# 先检查用户是否存在cursor.execute("SELECT * FROM Users WHERE ID = ?", user_id)if not cursor.fetchone():print(f"用户ID {user_id} 不存在")return# 构建更新SQLupdate_fields = []params = []if name is not None:update_fields.append("Name = ?")params.append(name)if age is not None:update_fields.append("Age = ?")params.append(age)if email is not None:update_fields.append("Email = ?")params.append(email)if not update_fields:print("没有提供更新信息")returnparams.append(user_id)sql = f"UPDATE Users SET {', '.join(update_fields)} WHERE ID = ?"cursor.execute(sql, params)conn.commit()print(f"用户ID {user_id} 更新成功")except Exception as e:print(f"更新用户失败: {e}")if 'conn' in locals():conn.rollback()finally:if 'conn' in locals():conn.close()def delete_user(user_id):"""删除用户"""try:conn = connect_db()cursor = conn.cursor()cursor.execute("DELETE FROM Users WHERE ID = ?", user_id)if cursor.rowcount > 0:conn.commit()print(f"用户ID {user_id} 删除成功")else:print(f"用户ID {user_id} 不存在")except Exception as e:print(f"删除用户失败: {e}")if 'conn' in locals():conn.rollback()finally:if 'conn' in locals():conn.close()def main():"""主函数"""while True:print("\n=== 用户管理系统 ===")print("1. 添加用户")print("2. 查看所有用户")print("3. 更新用户信息")print("4. 删除用户")print(0. "退出")choice = input("请选择操作(0-4): ")if choice == '1':name = input("请输入姓名: ")age = int(input("请输入年龄: "))email = input("请输入邮箱: ")add_user(name, age, email)elif choice == '2':list_users()elif choice == '3':user_id = int(input("请输入要更新的用户ID: "))print("请输入要更新的信息(直接回车跳过):")name = input("姓名: ") or Noneage_input = input("年龄: ")age = int(age_input) if age_input else Noneemail = input("邮箱: ") or Noneupdate_user(user_id, name, age, email)elif choice == '4':user_id = int(input("请输入要删除的用户ID: "))confirm = input(f"确定要删除用户ID {user_id} 吗?(y/n): ")if confirm.lower() == 'y':delete_user(user_id)elif choice == '0':print("谢谢使用,再见!")breakelse:print("无效的选择,请重新输入")if __name__ == "__main__":main()
九、常见问题与解决方案
1. 安装pyodbc失败
问题:在Windows上安装pyodbc时出现错误。
解决方案:
- 确保已经安装了Visual C++ Build Tools
- 或者尝试使用预编译的wheel包安装:
(注意:wheel文件名需要根据你的Python版本和系统架构调整)pip install pyodbc‑4.0.32‑cp38‑cp38‑win_amd64.whl
2. 连接失败
问题:连接SQL Server时出现"找不到数据源名称并且未指定默认驱动程序"错误。
解决方案:
- 检查ODBC驱动是否正确安装
- 检查连接字符串中的驱动名称是否与安装的版本匹配
- 尝试使用Windows身份验证模式连接
3. 权限问题
问题:执行某些操作时出现权限不足的错误。
解决方案:
- 确保使用的数据库用户具有足够的权限
- 使用具有管理员权限的账户登录SQL Server
4. 中文显示问题
问题:查询结果中的中文显示为乱码。
解决方案:
- SQL Server默认支持Unicode,中文通常不会有问题
- 如果确实遇到乱码,可以尝试在连接字符串中添加:
CharacterSet=utf8
十、总结
通过本教程,我们学习了如何使用Python 3.8连接SQL Server 2016并执行基本的增删改查操作。主要内容包括:
- 安装必要的软件和库(Python 3.8和pyodbc)
- 创建和配置数据库连接
- 使用SELECT语句查询数据
- 使用INSERT语句插入数据
- 使用UPDATE语句更新数据
- 使用DELETE语句删除数据
- 事务处理
- 编写简单的用户管理系统
- 常见问题的解决方案
希望本教程对初学者有所帮助!在实际工作中,你可能会遇到更复杂的情况,但掌握了这些基础知识后,你就可以进一步探索Python和SQL Server的更多功能了。
记住,实践是学习编程的最好方法,多写代码,多做练习,你会越来越熟练!
祝大家学习愉快!