MySQL Connector/Python:数据库交互与操纵指南

打印 上一主题 下一主题

主题 1897|帖子 1897|积分 5691

本文另有配套的佳构资源,点击获取  

  简介:MySQL Connector/Python是一个Python适配器,允许Python程序与MySQL数据库交互。它简化了执行SQL查询、管理数据库对象和处理数据的过程。它支持SQLAlchemy,并提供了数据库连接、游标管理、SQL执行、结果集处理、参数化查询、事务处理、兼容性、配置选项和错误处理等核心功能。通过学习和把握该适配器,开辟者可以更加高效地在Python项目中管理MySQL数据库。

1. MySQL Connector/Python简介

  MySQL Connector/Python 是一个为MySQL数据库提供原生Python编程语言接口的驱动程序。它是完全用Python编写的,不依赖于MySQL C客户端库,这意味着它可以在各种平台上运行,包罗Linux、Windows、Mac OS X以及其他支持Python的系统。
1.1 安装与配置

  安装MySQL Connector/Python 可以通过Python的包管理工具pip来完成。利用以下命令来安装:
  1. pip install mysql-connector-python
复制代码
安装完成后,就可以在Python代码中导入并利用它了:
  1. import mysql.connector
  2. # 创建连接
  3. conn = mysql.connector.connect(user='username', password='password', host='127.0.0.1', database='test')
复制代码
1.2 连接字符串参数

  MySQL Connector/Python 通过连接字符串的方式来配置连接参数。常见的参数如下:


  •   user  : 数据库用户名
  •   password  : 用户密码
  •   host  : 数据库主机地址,默以为本田主机
  •   database  : 要连接的数据库名称
  •   port  : 数据库监听端口,默以为3306
  利用连接字符串可以将多个参数合并成一个字符串,简化配置过程:
  1. conn_str = "user=root;password=rootpass;host=localhost;database=testdb"
  2. conn = mysql.connector.connect(user='root', password='rootpass', host='localhost', database='testdb')
复制代码
本章简要介绍了MySQL Connector/Python的根本概念、安装配置以及连接字符串参数的利用。这些知识构成了利用MySQL Connector/Python举行数据库操纵的底子。接下来的章节将会深入探讨怎样举行数据库连接受理、游标对象的利用等高级话题。
2. 数据库连接受理

  数据库连接受理是MySQL Connector/Python中最为核心的组成部分之一,它直接关系到应用的性能、安全性和可靠性。在本章节中,我们将深入探讨怎样建立和管理与MySQL数据库的连接,并分享一些高级的连接受理技术。
2.1 连接MySQL数据库的底子知识

  在开始与MySQL数据库举行交云之前,必须先建立一个连接。连接是应用程序和数据库服务器之间通讯的渠道,它是数据交互的底子。
2.1.1 数据库连接的必要性

  数据库连接相当于一座桥梁,连接着应用程序和数据库管理系统。没有这个连接,应用程序就无法向数据库发送查询请求或获取数据。此外,连接受理对于并发处理、资源优化和错误处理等方面也起着关键作用。
2.1.2 创建与关闭连接的方法

  在MySQL Connector/Python中,通常利用  mysql.connector.connect()  方法创建连接,利用  close()  方法关闭连接。下面是一个创建连接的简朴示例:
  1. import mysql.connector
  2. # 创建连接
  3. conn = mysql.connector.connect(
  4.     host="localhost",
  5.     user="yourusername",
  6.     password="yourpassword",
  7.     database="yourdatabase"
  8. )
  9. # 进行数据库操作...
  10. # 关闭连接
  11. conn.close()
复制代码
在此示例中,我们首先导入了  mysql.connector  模块。利用  connect()  方法,我们指定了连接数据库所需的参数。一旦不再需要连接时,我们调用  conn.close()  方法来关闭它。
2.2 高级连接受理技术

2.2.1 利用连接池优化连接

  连接池是一种连接受理技术,用于重用现有的数据库连接,避免了每次需要连接时创建和销毁连接的开销。这可以显著提高数据库操纵的性能。
  连接池的利用示比方下:
  1. from mysql.connector import pooling
  2. # 创建一个连接池
  3. config = {
  4.     'user': 'yourusername',
  5.     'password': 'yourpassword',
  6.     'host': 'localhost',
  7.     'database': 'yourdatabase'
  8. }
  9. pool_name = 'mypool'
  10. pool_size = 5
  11. cnxpool = pooling.MySQLConnectionPool(pool_name=pool_name, pool_size=pool_size, **config)
  12. # 从连接池获取连接
  13. conn = cnxpool.get_connection()
  14. # 使用连接...
  15. # 释放连接回连接池
  16. conn.close()
复制代码
在此段代码中,我们通过  MySQLConnectionPool  类创建了一个连接池,并指定了连接池的名称、大小和其他配置参数。通过  get_connection()  方法,我们可以从连接池中获取一个连接,操纵完成后,利用  close()  方法将连接释放回连接池。
2.2.2 连接超时与重连策略

  在应用程序中,大概会遇到网络延迟或数据库服务器暂时不可达的环境。为相识决这一问题,我们可以为连接设置超时参数,并实现重连策略。
  比方,我们可以设置  connect_timeout  参数来定义连接尝试的超时时间:
  1. conn = mysql.connector.connect(
  2.     host="localhost",
  3.     user="yourusername",
  4.     password="yourpassword",
  5.     database="yourdatabase",
  6.     connect_timeout=10  # 设置连接超时时间为10秒
  7. )
复制代码
对于重连策略,可以通过编写代码来实现。比方,可以捕捉连接失败的非常,并尝试重新连接:
  1. max_retries = 5
  2. retry_count = 0
  3. while retry_count < max_retries:
  4.     try:
  5.         conn = mysql.connector.connect(
  6.             host="localhost",
  7.             user="yourusername",
  8.             password="yourpassword",
  9.             database="yourdatabase"
  10.         )
  11.         break  # 成功连接,退出循环
  12.     except mysql.connector.Error as err:
  13.         if err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR:
  14.             print("用户名或密码错误")
  15.             break
  16.         elif err.errno == mysql.connector.errorcode.ER_CON_COUNT_ERROR:
  17.             print("连接数达到上限")
  18.             break
  19.         else:
  20.             print(f"连接失败,第 {retry_count+1} 次尝试")
  21.             retry_count += 1
  22.             time.sleep(2)  # 等待2秒后重试
  23. if conn.is_connected():
  24.     print("已成功建立连接")
  25. else:
  26.     print("连接失败")
复制代码
这段代码利用了非常处理结构来捕捉大概发生的连接错误,并根据错误类型举行相应的处理。如果是因为认证错误或连接数上限导致的失败,则直接报错并退出循环。如果是因为其他缘故原由导致连接失败,则会等待2秒后重试,最多重试5次。
  在本章节中,我们学习了怎样建立和管理MySQL数据库连接,把握了创建、关闭、以及利用连接池的技术。此外,我们还介绍了怎样处理连接超时和实现重连策略,这些都是在开辟高性能数据库应用时必不可少的技能。
  在下一章节中,我们将深入相识游标对象的利用,学习怎样高效地处理数据库中的数据。游标对象在数据检索和更新中扮演着重要角色,它允许我们一次处理结果集中的单行或多行数据,是数据库操纵中不可或缺的工具。
3. 游标对象的利用

3.1 游标的根本概念与类型

3.1.1 游标的作用及其在数据库操纵中的位置

  游标(Cursor)是数据库系统提供的一种机制,它允许用户在结果集中举行位置控制。利用游标,可以逐条处理查询结果集中的记载,而不是一次性返回全部数据。在数据库操纵中,游标的作用体现在以下几个方面:

  •    逐条处理数据 :当查询结果集很大时,一次性加载全部数据会导致内存斲丧过大,乃至大概造成程序崩溃。利用游标可以逐条访问结果集中的记载,有效控制内存利用。
  •    提高程序灵活性 :在复杂的业务逻辑中,大概需要根据前一条记载的处理结果来决定对后一条记载的操纵。游标允许程序控制记载的读取顺序,增加了数据处理的灵活性。
  •    数据的插入、更新和删除操纵 :游标不但可以用于读取数据,还能配合事务管理举行数据的修改和删除操纵。
  在MySQL Connector/Python中,游标是通过cursor()方法获得的。在数据库连接建立后,可以请求一个游标对象,并利用这个对象执行SQL语句,然后利用游标来获取和处理结果集。
3.1.2 差别类型游标的选择与应用场景

  MySQL Connector/Python支持差别类型的游标,每种游标根据其特点适用于差别的应用场景:

  •    普通游标 :这是最根本的游标类型,可以逐条获取查询结果集的记载。当需要在应用程序中手动处理大量数据时,普通游标是最常用的选择。
  •    滚动游标 :允许向前和向后移动查询结果集的游标。滚动游标提供了更大的灵活性,可以访问结果集中的恣意记载,而不但仅是当前记载或者向后的记载。当需要对结果集举行非线性访问时,滚动游标非常有用。
  •    字典游标 :利用列名作为键来访问数据行中的数据。这种类型的游标提高了代码的可读性,特殊是当查询返回多个列时。
  •    预取游标 :预取游标通过在单次查询中获取多条记载来减少与数据库服务器的交互次数,从而提高性能。这对于网络延迟较高或者需要频繁查询数据库的场景尤其有利。
  选择符合的游标类型能够对数据库操纵的性能和服从产生重要影响。比方,如果数据集较小,普通游标足以满足需求;而在数据量庞大且需要举行复杂处理的应用中,滚动游标或预取游标大概是更好的选择。
3.2 游标的高级操纵

3.2.1 怎样处理滚动游标

  滚动游标(Scroll Cursor)允许用户在结果集内向前或向后移动。在处理大型数据集或者需要随机访问记载时,滚动游标提供了很大的灵活性。
  1. import mysql.connector
  2. # 连接到数据库
  3. conn = mysql.connector.connect(
  4.     host='localhost',
  5.     user='yourusername',
  6.     password='yourpassword',
  7.     database='yourdatabase'
  8. )
  9. # 获取滚动游标
  10. cursor = conn.cursorscroll()
  11. # 执行查询
  12. cursor.execute("SELECT id, name FROM users")
  13. # 向后滚动
  14. cursor.scroll(1)
  15. current_user = cursor.fetchone()
  16. print(current_user)
  17. # 向前滚动
  18. cursor.scroll(-1, mode='relative')
  19. previous_user = cursor.fetchone()
  20. print(previous_user)
  21. # 关闭游标和连接
  22. cursor.close()
  23. conn.close()
复制代码
在上述代码中,  scroll()  方法通过两个参数控制滚动位置。第一个参数指定了滚动的单位数,正数表现向前滚动,负数表现向后滚动。第二个参数  mode  指定滚动方式,  'absolute'  表现绝对滚动,  'relative'  表现相对于当前位置的滚动。
  利用滚动游标时,必须留意不能举行SQL语句的动态构建,因为滚动游标需要在执行SQL之前就能确定结果集的结构。
3.2.2 利用游标举行数据修改和删除操纵

  游标不但可以用于读取数据,还能用于执行数据修改和删除操纵。通过对游标返回的结果集举行遍历和选择,可以定位到具体的数据记载,然后举行相应的数据库操纵。
  下面展示了怎样利用游标来执行数据的更新操纵:
  1. import mysql.connector
  2. # 连接到数据库
  3. conn = mysql.connector.connect(
  4.     host='localhost',
  5.     user='yourusername',
  6.     password='yourpassword',
  7.     database='yourdatabase'
  8. )
  9. # 获取游标对象
  10. cursor = conn.cursor()
  11. # 定位到特定数据记录并更新
  12. sql_update = "UPDATE employees SET salary = salary * 1.1 WHERE id = %s"
  13. params = (employee_id,)
  14. cursor.execute(sql_update, params)
  15. # 提交事务
  16. conn.commit()
  17. # 关闭游标和连接
  18. cursor.close()
  19. conn.close()
复制代码
在上述代码中,我们通过  cursor.execute()  方法来执行数据更新操纵。需要留意的是,当利用参数化查询时,参数应该以元组的形式提供。
  对于删除操纵,原理与更新类似,只需将SQL语句中的  UPDATE  关键字替换为  DELETE  ,并确保提供正确的参数。
  1. sql_delete = "DELETE FROM employees WHERE id = %s"
  2. cursor.execute(sql_delete, params)
复制代码
在利用游标执行这类操纵时,一定要小心处理功德务管理。如果更新或删除操纵需要在多个记载上举行,应该将这些操纵放入一个事务中,以保证数据的同等性。
  利用游标举行数据修改和删除操纵时,务必留意游标定位的准确性和事务的正确管理,防止数据丢失或差别等的问题。
4. SQL执行方法

4.1 执行静态SQL语句

4.1.1 execute方法的利用

  在数据库交互中,执行SQL语句是常见操纵之一。MySQL Connector/Python提供了  execute  方法,允许用户执行静态的SQL语句。利用  execute  方法时,首先需要创建一个游标对象(Cursor),然后通过该对象调用  execute  方法来执行SQL语句。
  1. import mysql.connector
  2. # 建立连接
  3. conn = mysql.connector.connect(user='root', password='your_password', host='127.0.0.1', database='test_db')
  4. cursor = conn.cursor()
  5. # 执行SQL语句
  6. cursor.execute("CREATE TABLE IF NOT EXISTS employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))")
  7. # 关闭游标和连接
  8. cursor.close()
  9. conn.close()
复制代码
在上述代码中,我们首先导入了  mysql.connector  模块,建立了与MySQL数据库的连接,并创建了一个游标对象。接着,我们调用了  execute  方法来创建一个名为  employees  的表,如果该表已经存在,则不会重复创建。最后,我们关闭了游标和连接。
4.1.2 多语句执行与事务

  在某些环境下,大概需要一次性执行多个SQL语句,比方批量插入数据。这可以通过调用游标的  executemany  方法来实现。此外,如果要在执行过程中利用事务,需要确保数据库连接处于自动提交模式关闭状态。
  1. # 关闭自动提交
  2. conn = mysql.connector.connect(user='root', password='your_password', host='127.0.0.1', database='test_db', autocommit=False)
  3. cursor = conn.cursor()
  4. try:
  5.     cursor.execute("INSERT INTO employees (name) VALUES ('Alice')")
  6.     cursor.execute("INSERT INTO employees (name) VALUES ('Bob')")
  7.     conn.commit()  # 提交事务
  8. except mysql.connector.Error as err:
  9.     conn.rollback()  # 出错则回滚事务
  10.     print("Error: ", err)
  11. finally:
  12.     cursor.close()
  13.     conn.close()
复制代码
上述代码中,我们首先关闭了自动提交模式,如许全部的SQL语句将会被放在一个事务中执行。在执行完毕后,如果一切正常,我们调用  commit  方法来提交事务。如果有错误发生,我们利用  rollback  方法回滚事务到初始状态,保证数据的同等性。
4.2 动态SQL构建与执行

4.2.1 利用字符串拼接构建动态SQL

  在某些场景下,根据程序的逻辑大概需要动态构建SQL语句。在Python中,可以利用字符串拼接的方式来实现这一点。
  1. name = 'Charlie'
  2. age = 30
  3. # 构建一个带有变量的SQL语句
  4. query = f"INSERT INTO employees (name, age) VALUES ('{name}', {age})"
  5. cursor = conn.cursor()
  6. cursor.execute(query)
  7. conn.commit()
  8. cursor.close()
  9. conn.close()
复制代码
在上面的代码示例中,我们通过格式化字符串的方式将变量  name  和  age  拼接到SQL语句中,然后执行该语句。这种方式简朴直观,但是也轻易引发SQL注入安全问题。
4.2.2 利用参数化查询提高安全性

  为了避免SQL注入,可以利用参数化查询的方式。这种方法不但可以提高安全性,还可以提高执行服从。
  1. name = 'Charlie'
  2. age = 30
  3. # 使用参数化的方式构建SQL语句
  4. query = "INSERT INTO employees (name, age) VALUES (%s, %s)"
  5. cursor = conn.cursor()
  6. cursor.execute(query, (name, age))
  7. conn.commit()
  8. cursor.close()
  9. conn.close()
复制代码
上述代码中,我们没有将变量直接插入到SQL语句中,而是利用占位符  %s  ,并在  execute  方法中传递一个包含参数的元组。这种方法的长处是可以有效防止SQL注入,而且很多数据库系统会自动缓存参数化查询的执行计划,从而提高执行服从。
  通过这些实例,我们可以看到怎样在MySQL Connector/Python中执行SQL语句,而且相识了静态和动态SQL执行方法。在现实应用中,需要根据具体需求选择符合的执行方式,而且始终关注安全性和性能优化。
5. 结果集处理技术

5.1 结果集的遍历和获取

  处理从数据库查询返回的结果集是日常数据库操纵中的一项重要任务。良好的结果集处理技术可以提高数据处理的服从,降低资源斲丧,而且使得数据处理流程更加清晰和易于管理。
5.1.1 结果集的迭代与索引访问

  在利用MySQL Connector/Python时,通常利用游标对象来处理结果集。迭代游标是一种常用的结果集遍历方式,尤其当处理大量数据时,逐条处理可以有效控制内存利用。
  1. import mysql.connector
  2. from mysql.connector import Error
  3. try:
  4.     connection = mysql.connector.connect(host='localhost', database='test', user='yourusername', password='yourpassword')
  5.     cursor = connection.cursor()
  6.     query = "SELECT * FROM employees"
  7.     cursor.execute(query)
  8.     for row in cursor:
  9.         print("ID:", row[0], "Name:", row[1])
  10. except Error as e:
  11.     print("Error while connecting to MySQL", e)
  12. finally:
  13.     if connection.is_connected():
  14.         cursor.close()
  15.         connection.close()
  16.         print("MySQL connection is closed")
复制代码
以上代码块展示了怎样利用  for  循环遍历游标中的结果集。在这个例子中,  row  变量代表了当前遍历到的行,它是一个元组,此中包含了该行中各列的数据。  row[0]  和  row[1]  分别表现该行的第一列和第二列数据。通过利用索引访问,我们可以访问到恣意一列的数据。
5.1.2 获取单行或多行数据的方法

  在处理结果集时,除了遍历全部行之外,通常会需要访问特定的行或多个特定行的数据。这可以通过指定游标的  fetchone  和  fetchmany  方法来实现。
  1. cursor.execute("SELECT * FROM employees WHERE id = %s", (employee_id,))
  2. employee = cursor.fetchone()
复制代码
利用  fetchone  方法可以获取结果集中的下一行。如果没有更多行可取,它会返回  None  。这是在期望查询结果只有一条记载时的常用方法。
  1. cursor.execute("SELECT * FROM employees WHERE department = %s", (department,))
  2. employees = cursor.fetchmany(size=5)
复制代码
而  fetchmany  方法允许一次从结果集中取出多行数据,  size  参数指定了需要取出的行数。当处理结果集中的大量数据,但又不盼望一次性将全部数据加载到内存时,  fetchmany  显得非常有用。
5.2 处理大数据集

  在处理大型数据库或大数据量的查询时,需要留意内存的利用环境和查询的性能。这通常涉及到分批处理数据和对临时存储的管理。
5.2.1 分批获取数据优化内存利用

  当面临大量数据时,一次性加载全部数据到内存中会导致内存的大量斲丧,乃至大概因为超出内存限制而失败。分批获取数据可以有效控制内存的利用。
  1. page_size = 100  # 每页显示100条数据
  2. start_from = 0   # 从第一条数据开始
  3. while True:
  4.     cursor.execute("SELECT * FROM big_table LIMIT %s OFFSET %s", (page_size, start_from))
  5.     rows = cursor.fetchall()
  6.     if not rows:
  7.         break
  8.     for row in rows:
  9.         print(row)
  10.     start_from += page_size
复制代码
这个代码示例展示了怎样通过调解  LIMIT  和  OFFSET  子句来分批处理数据。通过逐渐增加  OFFSET  的值,可以逐步获取下一批数据。当查询结果为空时,表现已到达结果集的末尾,循环竣事。
5.2.2 大数据集的临时存储与处理

  在某些环境下,需要对分批处理的数据举行临时存储,以便举行更深入的数据分析或举行复杂的数据操纵。可以利用临时表或内存中的数据结构来实现。
  1. import pandas as pd
  2. # 假设我们从数据库中分批次获取了数据,并存储到了data变量中
  3. data = []
  4. while True:
  5.     # 获取数据的逻辑
  6.     # ...
  7.     if not rows:
  8.         break
  9.     data.extend(rows)
  10. # 将数据转换成pandas的DataFrame进行处理
  11. df = pd.DataFrame(data)
复制代码
利用pandas库可以方便地将数据导入到DataFrame对象中举行分析和处理。这种方法的好处是,pandas提供了强大的数据处理能力,可以快速举行数据清洗、转换、聚合等操纵。同时,DataFrame对象在内存中处理数据时,相较于传统的关系型数据库查询服从更高。
  在第五章中,我们深入探讨了怎样有效地处理MySQL Connector/Python返回的结果集。从遍历和获取单条或多条记载的方法,到怎样处理大数据集并优化内存利用,本章为读者展示了在差别场景下处理结果集的技术和策略。通过现实的代码示例和逻辑分析,我们展现了怎样利用这些技术来提高数据处理的服从,同时保证操纵的安全性和性能。
6. 参数化查询的好处

6.1 防止SQL注入的机制

6.1.1 SQL注入的原理与危害

  SQL注入攻击是一种常见的网络攻击方式,攻击者通过在Web表单输入或通过URL查询字符串发送恶意SQL代码,当服务器端代码执行该输入数据时,恶意SQL代码会同时被执行。这种攻击可以绕过身份验证、粉碎数据完备性,乃至大概完全控制运行数据库服务器的系统。
  SQL注入能够工作的缘故原由是很多应用程序未对用户输入举行恰当的验证和转义。比方,一个简朴的登录查询大概会利用如下代码:
  1. SELECT * FROM users WHERE username = '$username' AND password = '$password';
复制代码
如果攻击者在用户名字段输入  ' OR '1'='1  ,那么查询将会变成:
  1. SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '$password';
复制代码
由于  '1'='1'  总是为真,这会导致无论密码输入为何值,用户都可以登录系统。
6.1.2 参数化查询怎样提供安全掩护

  参数化查询是一种预防SQL注入的措施,其核心思想是利用占位符代替直接在SQL语句中拼接变量。在执行查询之前,数据库系统会对这些占位符所代表的值举行恰当的转义处理,保证其作为数据而不是SQL代码的一部分被执行。
  比方,利用参数化查询的登录验证大概看起来像如许:
  1. cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
复制代码
在这个例子中,  %s  是参数占位符,在执行时由数据库系统处理,从而避免了直接将用户输入的变量拼接进SQL语句。纵然输入变量中包含潜在的SQL代码,如  username = ' admin' --  ,由于占位符的存在,它会被当作字符串数据处理,而不会执行  --  背面的解释部分。
  利用参数化查询能够确保用户输入的数据被安全处理,极大地减少了SQL注入的风险。
6.2 提高查询服从的策略

6.2.1 利用参数化查询优化性能

  参数化查询不但提供了安全掩护,还能够优化性能。数据库服务器通常会利用参数化查询举行查询优化,利用预编译的查询计划来提高执行服从。当雷同的SQL语句需要多次执行时,数据库引擎可以重用已经预编译的查询计划,减少编译时间,提高团体性能。
  比方,在一个循环中插入数据:
  1. for user in users:
  2.     cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", (user.name, user.email))
复制代码
在该例子中,雷同的SQL语句会被重复利用,数据库可以利用已经准备好的计划来执行这些插入操纵,相比于每次都编译新的插入语句,性能将大幅提升。
6.2.2 参数化与预编译语句的对比

  参数化查询通常与预编译语句紧密相关。预编译语句是一种编程技术,此中SQL语句在首次执行时被编译,之后再执行时,可以利用雷同的编译过的版本,只需要改变此中的参数。
  预编译语句的一个关键上风是减少数据库的负载。对于重复执行的查询,避免重复的语法分析和计划编译能够提高性能。在一些数据库中,预编译语句会通过SQL游标来实现,而在其他数据库中,这大概是一个独立的特性。
  从开辟者的角度,利用参数化查询可以使得代码更加清晰,易于维护。尽管在某些环境下,数据库的原生支持或者ORM(对象关系映射)框架能够简化参数化查询的利用,但明白其背后的原理是至关重要的。
  参数化查询和预编译语句的结合利用,提供了更加强大的性能优化机制,能够确保应用程序在执行数据库操纵时,既安全又高效。
7. 事务处理和数据同等性

7.1 事务的根本概念与控制

  事务是数据库管理系统中执行过程中的一个逻辑单位,由一个或多个操纵组成,这些操纵要么全部执行,要么全部不执行。它为数据操纵提供了“原子性”保证。事务的ACID特性是数据库管理系统保证数据同等性的基石,具体包罗:
7.1.1 事务的ACID特性介绍



  • 原子性(Atomicity) :事务中举行的全部操纵要么全部完成,要么完全不执行,不会停顿在中间状态。
  • 同等性(Consistency) :事务将数据库从一种同等性状态转换为另一种同等性状态,不违反任何数据库约束。
  • 隔离性(Isolation) :事务的执行不会被其他事务干扰,各个事务相互独立。
  • 持久性(Durability) :一旦事务提交,则其所做的更改会永久生存在数据库中。
  为了控制事务的执行,大多数数据库管理系统(DBMS)提供了  commit  和  rollback  操纵:
7.1.2 利用commit和rollback管理事务



  • commit :用于提交事务,即把事务中的全部操纵结果永久生存到数据库中。
  • rollback :用于回滚事务,即撤销全部未提交的更改。
  1. import mysql.connector
  2. # 连接数据库
  3. db = mysql.connector.connect(
  4.     host="localhost",
  5.     user="yourusername",
  6.     password="yourpassword",
  7.     database="yourdatabase"
  8. )
  9. cursor = db.cursor()
  10. # 开始事务
  11. db.start_transaction()
  12. try:
  13.     # 执行操作
  14.     cursor.execute("UPDATE yourtable SET yourcolumn = 'new value' WHERE id = 1")
  15.     # 提交事务
  16.     db.commit()
  17. except mysql.connector.Error as err:
  18.     # 回滚事务
  19.     db.rollback()
  20.     print("Error: ", err)
  21. cursor.close()
  22. db.close()
复制代码
在上述代码中,我们首先建立了一个数据库连接,并创建了一个游标。通过调用  start_transaction()  方法开始了一个新的事务。接着在try块中执行了一条更新操纵,并通过  commit()  方法提交了这个事务。如果在执行过程中发生任何错误,捕捉非常后将利用  rollback()  方法回滚全部更改,以保证数据的同等性。
7.2 高级事务管理策略

7.2.1 事务隔离级别及其影响

  SQL标准定义了四个事务隔离级别,它们分别是:


  • 读未提交(Read uncommitted)
  • 读已提交(Read committed)
  • 可重复读(Repeatable read)
  • 可串行化(Serializable)
  每个隔离级别提供了差别级别的数据隔离。越高的隔离级别通常意味着越强的数据同等性保证,但也会导致数据库的并发性能降低。在MySQL中,通过  SET TRANSACTION  语句或者在连接时指定隔离级别来设置隔离级别。
  1. -- 将当前事务的隔离级别设置为读已提交
  2. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
复制代码
7.2.2 分布式事务的应用与挑战

  在分布式系统中,跨多个数据库或服务的事务被称为分布式事务。分布式事务管理要比单一数据库系统复杂得多,因为需要保证跨服务的数据同等性。常见的分布式事务模型有两阶段提交(2PC)和三阶段提交(3PC)。
  分布式事务面临的主要挑战包罗:


  • 同等性保证 :确保操纵要么全部成功,要么全部回滚。
  • 性能开销 :尤其是在高负载的环境下,跨节点的协调会带来额外的延迟。
  • 资源锁定 :在事务执行过程中,资源大概被长时间锁定,这会影响系统的并发能力。
  应对这些挑战需要接纳复杂的事务管理协议,而且需要思量到事务的跨节点日记记载、故障规复机制以及大概的网络分区问题。对于需要高度同等性的分布式应用,这是一个需要审慎处理的问题。
   本文另有配套的佳构资源,点击获取  

  简介:MySQL Connector/Python是一个Python适配器,允许Python程序与MySQL数据库交互。它简化了执行SQL查询、管理数据库对象和处理数据的过程。它支持SQLAlchemy,并提供了数据库连接、游标管理、SQL执行、结果集处理、参数化查询、事务处理、兼容性、配置选项和错误处理等核心功能。通过学习和把握该适配器,开辟者可以更加高效地在Python项目中管理MySQL数据库。
   本文另有配套的佳构资源,点击获取  



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表