Python3_MySQL数据库连接 - PyMySQL 驱动

2023-11-11

数据库连接

连接数据库前,请先确认以下事项:

  • 您已经创建了数据库 TESTDB.
  • 在TESTDB数据库中您已经创建了表 EMPLOYEE
  • EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 连接数据库ILen_Devops使用的用户名为 "root" ,密码为 "blueware",你可以可以自己设定或者直接使用root用户名及其密码,Mysql数据库用户授权请使用Grant命令。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","ILen_Devops" )

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

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

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

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

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

#执行结果:

创建数据库表

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

# 使用 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)

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

#执行结果:

数据库插入操作

以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

# 使用 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()
except:
   # 如果发生错误则回滚
   db.rollback()

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

#执行结果:

以上例子也可以写成如下形式:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

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

# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()

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

#执行结果:

以下代码使用变量向SQL语句中传递参数:

con.execute('insert into Login values( %s,  %s)' % \
             (user_id, password))

数据库查询操作

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

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

实例:

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

# 使用 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 ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
             (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")

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

#执行结果:

数据库更新操作

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

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

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

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

#执行结果:

删除操作

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql
# 打开数据库连接
db = pymysql.connect("192.168.109.128","root","blueware","runoob_db" )

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

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

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

#执行结果:

执行事务

事务机制可以确保数据一致性。

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

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

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

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

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

错误处理

DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

操作数据库与操作文件类似,在读取修改开始和结束时都需要进行连接(打开),断开(关闭)等固定操作,文件读写时可以使用 with (上下文管理器)来简化操作,数据库当然也是可以的:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Author: zhaosj

import pymysql

class DB():
    def __init__(self, host='192.168.109.128', port=3306, db='Devops', user='root', passwd='blueware', charset='utf8'):
        # 建立连接
        self.conn = pymysql.connect(host=host, port=port, db=db, user=user, passwd=passwd, charset=charset)
        # 创建游标,操作设置为字典类型
        self.cur = self.conn.cursor(cursor = pymysql.cursors.DictCursor)
    def __enter__(self):
        # 返回游标
        return self.cur
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 提交数据库并执行
        self.conn.commit()
        # 关闭游标
        self.cur.close()
        # 关闭数据库连接
        self.conn.close()
#####查询数据表并返回结果#########
    def query(self, sql_str):
        '''查询数据并返回
             cursor 为连接光标
             sql_str为查询语句
        '''
        try:
            self.cur.execute(sql_str)
            rows = self.cur.fetchall()
            return rows
        except:
            return False


if __name__ == '__main__':
    mydb =DB()
    #创建调用类中的查询函数属性
    results =mydb.query('select * from auth_user')
    print(results)

#执行结果:

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3_MySQL数据库连接 - PyMySQL 驱动 的相关文章

随机推荐

  • shell脚本之awk命令——分隔符介绍

    文章目录 awk入门 awk F awk命令之 分割符 awk命令之 分割符 awk入门 关于awk命令的基础用法 请参考Linux awk命令 awk F awk F F相当于内置变量FS 指定分割字符 fs是一个字符串或者是一个正则表达
  • 华为OD机试 C++ 优秀学员统计

    题目 任务 你的工作是帮我们找出打卡次数最多的前五名员工 有些小细节需要注意 如果两位员工打卡次数一样多 那么先打卡的员工排名更靠前 如果他们开始打卡的时间也一样 那就按照员工id的大小排序 id小的员工排在前面 输入 第一行是员工的数量N
  • Vue3 toRef

    toRef 可以用来为一个 reactive 对象的属性创建一个 ref 这个 ref 可以被传递并且能够保持响应性 作用 创建一个 ref 对象 其value值指向另一个对象中的某个属性 说明 在模板使用的时候 如果一个对象嵌套的太深 那
  • 利用OpenCV对视频进行拆帧处理

    文章目录 简介 输入输出 源代码 Python 简介 提供一种利用OpenCV对视频进行拆帧 并制作成图片集的方式 输入输出 输入 视频文件所在文件夹 输出 按视频文件命名的文件夹下保存图片 源代码 Python import cv2 im
  • C++中虚函数和非虚函数重载在继承时的区别

    这里唯一想说明的一点就是 使用虚函数继承时 当继承类被强转成基类后调用虚函数 调用的还是继承类的虚函数 而重载方式的继承类被强转成基类再调用重载函数 则调用的是基类的函数 废话不多说 上代码 cpp view plain copy incl
  • xss-labs/level11

    首先输入 丝毫不差 没有出现回弹现象 根本就不出人意料好吧 接着来看一下源代码好吧 能够看得出来第一个输出点由于htmlspecialchars转义操作 所以上述代码根本行不通 这一关比上一关又多了一个隐藏表单 一共是有四个隐藏表单 从第四
  • 【ARM】使用模板编写dht11温湿度linux驱动程序

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https gitee com stylle linux code 点赞 收藏 再看 养成习惯 订阅的粉丝可通过PC端文末加我微信 可对文章的内容进
  • #STM32 GPIO编程详解

    硬件环境 stm32f407zet6 软件环境 mdk5 1 GPIO概述 GPIO 翻译为通用输入输出 也就是软件可编程引脚 也就是MCU通过控制GPIO来完成一系列的功能 GPIO属于引脚 但引脚还包含电源 晶振 下载 boot 复位等
  • robotframework安装包_Robot Framework零基础入门教程

    1 介绍 1 1 介绍Robot Robot Framework是一个基于关键字驱动的自动化测试框架 通过该框架 测试人员可使用python封装关键字 并在非代码环境下使用关键字构建可被执行的测试用例 Robot Framework官方网站
  • 右下角对勾图形html,ZOJ 3203 Light Bulb(数学对勾函数)

    Light BulbTime Limit 1 Second Memory Limit 32768 KB Compared to wildleopard s wealthiness his brother mildleopard is rat
  • Windows部署证书颁发服务器

    证书颁发服务器的部署 1 Windows Server 证书是什么 Windows Server 证书是用于保护网络服务器的安全认证的重要工具 它是一种电子文件 由一个受信任的第三方机构 称为证书颁发机构 签发 用于确认网络服务器的身份 2
  • 贺TDSQL喜提286万QPS!本文回顾了它的十年锻造之路

    导读 2017年 在英特尔 腾讯金融分布式数据库TDSQL团队的共同见证下 TDSQL采用英特尔提供的高端平台 跑出了创造历史的最快性能数据 峰值286万QPS 相比于上一代处理器 性能提升了近4倍 是32核 220GB实例的38倍 TDS
  • fileinput组件将文件上传到服务器的路径编写方法以及Tomcat的配置

    1 先配置文件上传时Tomcat的虚拟路径 system file read location http localhost 8080 fileserversavepath 这是访问图片的地址 system file write locat
  • 数据库 数据丢失问题 及解决方案

    什么是数据丢失 两个线程基于同一个查询结果进行修改 后修改的人会将先修改人的修改覆盖掉 让我们先来看这么个小案例 我们给游戏充值100 支付成功后 银行会向游戏服务器发送支付成功信息 有一个订单支付信息表 order 和一个账户信息表 ac
  • RestTemplate的简单使用

    什么是RestTemplate Spring RestTemplate 是 Spring 提供的一种简单便捷的模板类 提供了多种便捷访问远程Http服务的方法 用于访问 Rest 服务的客户端 能够大大提高客户端的编写效率 RestTemp
  • 深度学习之图片转成pkl格式的训练集

    怎么使用python将文件夹下的图片转换pkl格式的训练集 首先需要读取图片和图片所属的类别 主要思路是 1 生成train Thumbs db 2 生成label Thumbs db 3 将train Thumbs db 和label T
  • Python3 爬虫教程 - 新兴网页解析利器 parsel

    1 介绍 parsel 这个库可以对 HTML 和 XML 进行解析 并支持使用 XPath 和 CSS Selector 对内容进行提取和修改 同时它还融合了正则表达式提取的功能 功能灵活而又强大 同时它也是 Python 最流行爬虫框架
  • 基于卷积神经网络CNN的多输入多输出预测,卷积神经网络CNN的回归预测,多变量输入模型。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • php如何无水印解析快手,快手短视频无水印解析过程及代码

    重要 本文最后更新于2020 08 22 08 26 13 某些文章具有时效性 若有错误或已失效 请在下方留言或联系代码狗 抖音快手作为目前最大的两大视频平台 使用量是非常大的 看到某些好看的视频想要保存下来但是又有水印改怎么办呢 狗哥已经
  • Python3_MySQL数据库连接 - PyMySQL 驱动

    数据库连接 连接数据库前 请先确认以下事项 您已经创建了数据库 TESTDB 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST NAME LAST NAME AGE SEX 和 INCOME 连接