当前位置: 首页 > news >正文

Python3.8对SQL Server 2016增删改查教程(小白版)

Python3.8对SQL Server 2016增删改查教程(小白版)

前言

欢迎阅读本教程!这是一篇专为零基础或初学者编写的Python操作SQL Server数据库的入门指南。在日常工作和学习中,我们经常需要用编程语言来操作数据库,本文将详细介绍如何使用Python 3.8来连接SQL Server 2016,并进行增删改查(CRUD)操作。

本文档将包括以下内容:

  1. 准备工作(安装必要的软件和库)
  2. Python连接SQL Server数据库
  3. 执行查询操作(SELECT)
  4. 执行插入操作(INSERT)
  5. 执行更新操作(UPDATE)
  6. 执行删除操作(DELETE)
  7. 事务处理
  8. 常见问题与解决方案

让我们开始吧!

一、准备工作

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. 常见的连接错误及解决方法

  1. 驱动问题:如果提示找不到驱动,请检查你安装的ODBC驱动版本,并修改连接字符串中的DRIVER部分。

    • 可以在"控制面板 > 管理工具 > ODBC数据源(64位)"中查看已安装的驱动。
  2. 认证问题:如果提示登录失败,请检查用户名和密码是否正确。

    • 也可以使用Windows身份验证模式连接:
      conn_str = r"DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes"
      

三、执行查询操作(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包安装:
    pip install pyodbc‑4.0.32‑cp38‑cp38‑win_amd64.whl
    
    (注意:wheel文件名需要根据你的Python版本和系统架构调整)

2. 连接失败

问题:连接SQL Server时出现"找不到数据源名称并且未指定默认驱动程序"错误。

解决方案

  • 检查ODBC驱动是否正确安装
  • 检查连接字符串中的驱动名称是否与安装的版本匹配
  • 尝试使用Windows身份验证模式连接

3. 权限问题

问题:执行某些操作时出现权限不足的错误。

解决方案

  • 确保使用的数据库用户具有足够的权限
  • 使用具有管理员权限的账户登录SQL Server

4. 中文显示问题

问题:查询结果中的中文显示为乱码。

解决方案

  • SQL Server默认支持Unicode,中文通常不会有问题
  • 如果确实遇到乱码,可以尝试在连接字符串中添加:CharacterSet=utf8

十、总结

通过本教程,我们学习了如何使用Python 3.8连接SQL Server 2016并执行基本的增删改查操作。主要内容包括:

  1. 安装必要的软件和库(Python 3.8和pyodbc)
  2. 创建和配置数据库连接
  3. 使用SELECT语句查询数据
  4. 使用INSERT语句插入数据
  5. 使用UPDATE语句更新数据
  6. 使用DELETE语句删除数据
  7. 事务处理
  8. 编写简单的用户管理系统
  9. 常见问题的解决方案

希望本教程对初学者有所帮助!在实际工作中,你可能会遇到更复杂的情况,但掌握了这些基础知识后,你就可以进一步探索Python和SQL Server的更多功能了。

记住,实践是学习编程的最好方法,多写代码,多做练习,你会越来越熟练!

祝大家学习愉快!

http://www.dtcms.com/a/507544.html

相关文章:

  • 直播回顾|PostgreSQL 18 六大新特性深度解析
  • 指尖上的物理引擎:Haply三轴力反馈控制器全系列详解
  • SQL之参数类型讲解——实战驱动的参数优化与高阶应用
  • 电商培训心得体会总结简短济南seo网站关键词排名
  • 中国建设银行官网网站动态视觉设计网站
  • AI Agent的概念
  • 解决 VirtualBox 打不开的问题
  • 如何做视频网站技术郑州有没有厉害的seo顾问
  • 宁夏网站建设价格wordpress选图框
  • 将联系人添加到iPhone的8种有效方法
  • Flask入门教程——李辉 第四章 静态文件 关键知识梳理
  • 可信赖的邵阳网站建设电子商务网站建设 以为例
  • 汽车排放检测的实操痛点突破:南华 NHA-604/605 测试仪核心技术难点解决方案
  • 家具3D效果图云渲染的网站是什么
  • 微硕WSK100P06 P沟MOSFET:汽车PTC加热器“极速开关闸”
  • Kubernetes(七) Pod控制器与配置资源管理详解
  • 利用R绘制小提琴图
  • 【23】MFC入门到精通——MFC资源视图 报错“在另一个编辑器中打开” ,MFC Dialog窗口消失 资源视图“在另一个编译器中打开”
  • 微服务学习笔记(黑马商城)
  • 全面解读大型语言模型测评:从认知演进到实操框架
  • 网站建设页面图跨境电商平台设计
  • 全景网站开发postfix wordpress
  • 好文与笔记分享 AI Agent设计与实现
  • AI风险评估模型下的黄金高位回调近2%:美元走强与避险情绪降温的量化分解
  • 真空共晶炉选型秘籍
  • 国外设计欣赏网站wordpress电影网盘
  • 智能饮水机方案开发MCU主控芯片要求
  • 做网站的步骤视频工程造价专业建设规划
  • HTTPS的加密方式
  • vue3提升 -- 1