查看原文
其他

Python操作mysql(下)! 一文带你看懂!

酷头酷头 印象Python 2022-08-01
文 | 酷头
来源:印象python「ID: python_logic」

嗨!朋友,我是酷头
欢迎来到学习python的宝藏基地~~~


上一节我们安装了Mysql8。

Python操作mysql(上)!一文带你看懂!


由于Mysql服务器以独立的进程运行,并通过网络对外服务。所以我们需要支持Python的Mysql驱动来连接Mysql服务器。

在Python中支持Mysql的数据库模块有很多,在这里我们选择使用PyMySql




PyMsql的安装


PyMysql的安装很简单,安装命令如下:

pip install pymysql


如下代表正常成功。





连接数据库


使用数据库的第一步就是连接数据库,接下来我们看看如何使用PyMysql连接数据库。

1:连接数据库2:创建游标对象3:对数据库进行增删改查4:关闭游标5:关闭连接



  import pymysql

  # 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306)
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # 使用 execute()  方法执行 SQL 查询
  cursor.execute("SELECT VERSION()")

  # 使用 fetchone() 方法获取单条数据.
  data = cursor.fetchone()

  print("Database version : %s " % data)

  # 关闭数据库连接
  db.close()

  '''
  连接成功!
  Database version : 8.0.25 
  '''

操作运行结果:
连接成功!
Database version : 8.0.25 


创建数据库表


如果数据库连接存在我们可以使用execute()方法来为数据库创建表,

如下所示创建表EMPLOYEE:


import pymysql

# 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # 使用 execute() 方法执行 SQL,如果表存在则删除
  cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

  # 使用预处理语句创建表
  sql = """CREATE TABLE EMPLOYEE (
           FIRST_NAME  CHAR(20) NOT NULL,
           LAST_NAME  CHAR(20),
           AGE INT,  
           SEX CHAR(1),
           INCOME FLOAT )"""


  cursor.execute(sql)
  print('建表成功!')

  # 关闭数据库连接
  db.close()

  '''
  连接成功!
  建表成功!
  '''
  

操作运行结果:
连接成功!
建表成功!

我们可以打开Sqlyog发现在我们名称为Mysql8的数据库下多了一个EMPLOYEE 的Table。如下图:




插入数据


我们来看看如何使用INSERT语句向表 EMPLOYEE 插入数据。


  import pymysql

  # 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # SQL 插入语句
  sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
           LAST_NAME, AGE, SEX, INCOME)
           VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""

  try:
      # 执行sql语句
      cursor.execute(sql)
      # 提交到数据库执行
      db.commit()
      print('数据插入成功!')
  except:
      # 如果发生错误则回滚
      db.rollback()
      print('数据插入错误!')

  # 关闭数据库连接
  db.close()

  '''
  连接成功!
  数据插入成功!
  '''


操作运行结果:

连接成功!
数据插入成功!




数据库查询操作


Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。


fetchone(): 该方法获取下一个查询结果集。结果集是一个对象fetchall(): 接收全部的返回结果行.rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。‍‍‍‍‍



查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:


  import pymysql

  # 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # SQL 查询语句
  sql = "SELECT * FROM EMPLOYEE \
         WHERE INCOME > %s"
 % (1000)
  try:
      # 执行SQL语句
      cursor.execute(sql)
      # 获取所有记录列表
      results = cursor.fetchall()
      for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
          # 打印结果
          print('数据查询成功!')
          print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
                (fname, lname, age, sex, income))
  except:
      print("Error: unable to fetch data")

  # 关闭数据库连接
  db.close()
  '''
  连接成功!
  数据查询成功!
  fname=Mac,lname=Mohan,age=20,sex=M,income=2000.0
  '''

操作运行结果:

连接成功!
数据查询成功!
fname=Mac,lname=Mohan,age=20,sex=M,income=2000.0



数据库更新操作


更新操作用于更新数据表的的数据,以下实例将 TESTDB 表中 SEX 为 'M' 的 AGE 字段递增 1:


  import pymysql

  # 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # SQL 更新语句
  sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
  try:
      # 执行SQL语句
      cursor.execute(sql)
      # 提交到数据库执行
      db.commit()
      print('数据更新成功!')
  except:
      # 发生错误时回滚
      db.rollback()

  # 关闭数据库连接
  db.close()

  '''
  连接成功!
  数据更新成功!
  '''


操作运行结果:

连接成功!
数据更新成功!




删除操作


删除操作用于删除数据表中的数据,

以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:


  import pymysql

  # 打开数据库连接
  try:
      db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')
      print('连接成功!')
  except:
      print('something wrong!')

  # 使用 cursor() 方法创建一个游标对象 cursor
  cursor = db.cursor()

  # SQL 删除语句
  sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
  try:
      # 执行SQL语句
      cursor.execute(sql)
      # 提交修改
      db.commit()
      print('数据删除成功')
  except:
      # 发生错误时回滚
      db.rollback()

  # 关闭连接
  db.close()
  '''
  连接成功!
  数据删除成功
  '''


操作运行结果:

连接成功!
数据删除成功



执行事务


什么是事务?

转账是生活中常见的操作,比如从A账户转账100元到B账号。


站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:


1.将A账户的金额减少100元

2.将B账户的金额增加100元。



在这个过程中可能会出现以下问题:



1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
3.同时又另一个用户转账给B账户,由于同时对B账户进行操作,导致B账户金额出现异常。



为了便于解决这些问题,需要引入数据库事务的概念。


事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。






原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。
一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)
2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。


在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面


  # SQL删除记录语句
  sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
  try:
     # 执行SQL语句
     cursor.execute(sql)
     # 向数据库提交
     db.commit()
  except:
     # 发生错误时回滚
     db.rollback()


对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。


commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。

回复关键词 「linux」,即可获取 185 页 Linux 工具快速教程手册和154页的Linux笔记。


回复关键词 「Python进阶」,即可获取 106 页 Python 进阶文档 PDF


回复关键词 「Python面试题」,即可获取最新 100道 面试题 PDF


回复关键词 「python数据分析」,即可获取47页python数据分析与自然语言处理的 PDF


回复关键词 「python爬虫」,满满五份PPT爬虫教程和70多个案例


回复关键词 「Python最强基础学习文档」,即可获取 168 页 Python 最强基础学习文档 PDF,让你快速入门Python

推荐我的微信号

来围观我的朋友圈,我的经验分享,技术更新,不定期送书,坑位有限,速速扫码添加!
备注:开发方向_昵称_城市,另送你10本Python电子

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存