Python数据库操作 ---- pymysql教学

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 文章主要讲解了pymysql的使用,创建数据库、创建数据表、插入数据、查询数据、更新数据、删除数据

@[toc]

前提准备

安装mysql

在使用pymysql的前提就是又一个mysql数据库,这个数据库可以是本地数据库也可以是远程的数据库,
mysql的安装这里就不再赘述了,大家可以参考其他的模块进行安装

安装pymysql

pip install pymysql

连接数据库


 import pymysql
# 连接数据库
db = pymysql.connect(host='localhost',user='root',password='123456',port=3306)
# 创建数据库的游标
cursor = db.cursor()
#execute()方法并执行 SQL 语句
cursor.execute("select version()")
# 读取第一条数据
data = cursor.fetchone()
print(data)
# 关闭连接
db.close()

# 输出:
# ('8.0.24',)

解释:
在连接数据的时候需要指定相应的参数

  • host 数据库ip地址,如果是本地可以用localhost或127.0.0.1 如果是远程就需要指定正确的ip地址
  • user 用户名
  • password 密码
  • port 端口号 如果不指定就默认是3306

cursor():获取数据库的操作游标
execute() 执行SQL语句,把要进操作的内容写成SQL语句,
fetchone() 读取一条数据
close() 断开连接,释放资源
"select version()" sql语句的执行结果
在这里插入图片描述

创建数据库

import pymysql
# 连接数据库
db = pymysql.connect(host='localhost',user='root',password='123456')
# 创建数据库的游标
cursor = db.cursor()
# 创建数据库spiders
cursor.execute("create database spiders")
# 关闭连接
db.close()

在这里插入图片描述
创建数据库命令执行一次就可以,后面我们在创建的数据库中进行其他的操作,如果创建的数据已经存在程序会报错"Can't create database 'spiders'; database exists"
拓展:

如果在创建数据库的不能确认数据库是否存在,但是也不想在创建数据库的时候发生报错可以使用下列语句: create database if not exists dbname

创建数据表、

表必须创建在数据库内,所以我们需要在连接数据库以后,需要指定操作那个数据库

import pymysql
# 连接数据库
db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')
# 创建数据库的游标
cursor = db.cursor()
sql = "create table if not exists students(id varchar(255) not null,name varchar(255) not null,age int not null,primary key (id))"
cursor.execute(sql)

db.close()

在这里插入图片描述
这次的在连接mysql的时候connect函数新增了一个参数,db='spiders'指定我们要连接的数据库,后面创建的表也会创建到当前数据库。

创建数据库的sql语句是`
"create table if not exists students(id varchar(255) not null,name varchar(255) not null,age int not null,primary key (id))"`
创建的数据库名为students,三列 idnameage,都是非空,主键为id

插入数据

import pymysql

db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
cursor = db.cursor()
id = '10005'
name = 'zhangsan'
age = '20'
#方式1
# sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
# cursor.execute(sql)
# 方式2
# sql = "insert into students(id,name,age) values('{}','{}','{}')".format(id,name,age)
# cursor.execute(sql)
# 方式3(推荐)
sql = "insert into students(id,name,age) values(%s,%s,%s)"
cursor.execute(sql,(id,name,age))
db.commit()
db.close()

通过三种sql语句的编写形式我们能够发现。方式3的最为简洁,通过使用%s来进行占位,然后再通过execute()函数将数据传入sql语句中组成完整的sql语句。

在执行execute()方法之后必须要commit()方法才能将数据插入到表中,这个设计到了事务的原子性问题,事务机制可以确保数据一致性,事务有4个属性:原子性、一致性、隔离性、持久性。
属性 描述
原子性 事务是一个不可分割的工作单位,事务中包括的操作要么都执行,要么都不执行
一致性 事务必须是数据库中一个一致性状态转变到另一个一致性状态,一致性与原子性是密切相关的
隔离性 一个事务不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务时隔离的,并发的各个事务之间不能相互干扰
持久性 持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响

查询数据

在数据库操作的过程中使用最多的就是查询操作

import pymysql

db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
try:
    sql = 'select * from students'
    cursor = db.cursor()
    cursor.execute(sql)
    d1 = cursor.fetchone()
    print("获取一条数据",d1)
    all_d = cursor.fetchall()
    print("获取所有数据",all_d)
    # sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
except:
    print("Error")
db.close()

数据库中的数据
在这里插入图片描述
输出:
在这里插入图片描述
通过结果我们能够看到etchone()执行正常,拿出了一条数据,但是fetchall()明明是查询所有,但是结果只有除了第一条之外的数据,关于这个现象我们可以从游标的角度来解释,一开始游标在第一行执行etchone()之后游标就跑到第二行,再执行fetchall()的时候就从第二行开始查询直至末尾。
可以简单的理解etchone()查询游标所在的一行数据,fetchall()查询当前游标至结束的所有行数据。

使用where进行条件查询

查询id大于10003的数据

import pymysql

db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
try:
    sql = 'select * from students where id>10003'
    cursor = db.cursor()
    cursor.execute(sql)
    all_d = cursor.fetchall()
    print("获取所有数据",all_d)
    # sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
except:
    print("Error")
db.close()

输出:
在这里插入图片描述

更新数据

跟新数据,有时候我们再会对数据库中原来的数据进行修改

import pymysql

db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
try:
    sql = 'update students set name=%s where id=%s'
    cursor = db.cursor()
    cursor.execute(sql,('李四','10004'))
    db.commit()
except:
    db.rollback()
db.close()

删除数据

根据条件删除数据,删除id小于10004的数据

import pymysql

db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
try:
    sql = 'delete from students where id<%s'
    cursor = db.cursor()
    cursor.execute(sql,('10004'))
    db.commit()
except:
    db.rollback()
db.close()

实战应用

在实际应用时,一般数据都是字典或者对象这种数据,所以需要我们在拼接SQL语句的时候更加的灵活。

插入数据,若数据存在更新数据

import pymysql

data = {
    'id':'10006',
    'name':'王五',
    'age':45
}
# 连接数据库
db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
table = 'students' # 表名
keys = ','.join(data.keys()) # 拼接插入的字段
values = ','.join(['%s']*len(data)) # 添加占位符
# 使用with关键字,Python 解释器会自动释放资源。 它还提供错误处理
with db:
    cursor = db.cursor()
    sql = 'insert into {}({}) values({}) on duplicate key update'.format(table, keys, values)
    update = ','.join([" {key}=%s".format(key=key) for key in data])
    sql += update
    try:
        cursor.execute(sql, tuple(data.values()) * 2)
        db.commit()
    except:
        db.rollback()

可以发现在sql语句中有 on duplicate key update:当主键存在的时候更新数据。
我们可以根据cursor.execute()的返回值来判断数据是插入操作还是更新操作

  • 0 主键存在,且数据一样没有更新
  • 1 主键不存在,插入数据
  • 2 主键存在,更新操作

总结

通过pymysql我们实现了创建数据库,创建表,以及对数据的增删改查,这种基本的操作,通过这些我们也能够发现pymysql的主要作用就是连接数据库将指令传递给mysql,具体的功能实现还是需要我们自己编写sql语句,因此在使用pymysql的前提是能够熟练编写sql语句。
关于pymysql的一些技巧以及优化后面会有新的文章来讲解
在这里插入图片描述

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
137 68
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
206 15
|
3月前
|
关系型数据库 MySQL 数据处理
探索Python中的异步编程:从asyncio到异步数据库操作
在这个快节奏的技术世界里,效率和性能是关键。本文将带你深入Python的异步编程世界,从基础的asyncio库开始,逐步探索到异步数据库操作的高级应用。我们将一起揭开异步编程的神秘面纱,探索它如何帮助我们提升应用程序的性能和响应速度。
|
3月前
|
存储 缓存 Shell
你知道 Python 其实自带了小型数据库吗
你知道 Python 其实自带了小型数据库吗
30 2
你知道 Python 其实自带了小型数据库吗
|
3月前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
190 4
|
3月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
53 4
|
3月前
|
SQL 机器学习/深度学习 数据采集
SQL与Python集成:数据库操作无缝衔接22.bijius.com
自动化数据预处理:使用Python库(如Pandas)自动清洗、转换和准备数据,为机器学习模型提供高质量输入。 实时数据处理:集成Apache Kafka或Amazon Kinesis等流处理系统,实现实时数据更新和分析。
|
3月前
|
机器学习/深度学习 Linux Python
Python编程教学
【10月更文挑战第2天】Python教学
67 13
|
3月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
78 3
|
3月前
|
SQL 机器学习/深度学习 数据库
SQL与Python集成:数据库操作无缝衔接
在开始之前,确保你已经安装了必要的Python库,如`sqlite3`(用于SQLite数据库)或`psycopg2`(用于PostgreSQL数据库)。这些库提供了Python与SQL数据库之间的接口。
下一篇
开通oss服务