Python使用PyMySQL连接操作MySQL数据库
前面文章介绍了使用mysql-connector
来连接操作MySQL数据库。今天我们就来使用PyMySQL连接数据库,实现简单的CDUD增删改查。
PyMySQL和mysql-connector都是Python中用于连接和操作MySQL数据库的库,但它们有一些区别。
- 安装方式:PyMySQL可以通过pip安装,而mysql-connector需要从官方网站下载并手动安装。
- 兼容性:PyMySQL兼容Python 2.x和3.x版本,而mysql-connector只兼容Python 3.x版本。
- API接口:PyMySQL使用纯Python编写,提供了一个简单易用的API接口。mysql-connector则是使用C编写的,提供了更多高级功能和选项。
- 性能:由于mysql-connector是使用C编写的,因此在性能方面可能会比PyMySQL更快一些。
- 功能支持:两者都支持基本的数据库操作,如查询、插入、更新和删除数据。但是mysql-connector提供了更多高级功能,如事务处理、存储过程和游标等。
总体来说,如果你需要一个简单易用的库来连接和操作MySQL数据库,并且需要兼容Python 2.x版本,则推荐使用PyMySQL。如果你需要更多高级功能,并且只需要兼容Python 3.x版本,则可以考虑使用mysql-connector。
安装
PyMySQL官网
安装其实很简单,和之前一样使用pip。
pip3 install PyMySQL
Requirements
Python – one of the following:
- CPython >= 3.7
- Latest PyPy 3
MySQL Server – one of the following:
- MySQL >= 5.7
- MariaDB >= 10.3 当然我们也看到是有些前提条件的。我们要使用Python3,并且MySQL的版本要大于等于5.7
成功安装!(使用之前一定要确保我们已经成功安装。)
我们可以看到官网也是提供了CRUD Examples。但还是不是很详细。接下来我们较为详细的介绍一下。
创建表
我们编写一条创建表的SQL,然后通过execute()
方法来为数据库创建表。
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS USER")
# 使用预处理语句创建表
sql = """"CREATE TABLE USER (Id VARCHAR(255), name VARCHAR(255))""""
cursor.execute(sql)
# 关闭数据库连接
db.close()
可以放心execute()
是用来执行SQL语句的。所以我们插入操作就可以这样 。
插入记录
向User表插入一条记录
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO user (Id, name) VALUES ('1', 'zs')"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行(数据表内容有更新,必须使用到该语句)
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
当然我们也可以使用占位符这种方式,绑定参数。
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO user (Id, name) VALUES (%s, %s)"
try:
# 执行sql语句
cursor.execute(sql, val)
# 提交到数据库执行(数据表内容有更新,必须使用到该语句)
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
批量插入
向User表批量插入多条记录。批量插入使用executemany()
方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO user (Id, name) VALUES (%s, %s)"
val = [ ('2', 'ls'), ('3', 'ww'), ('4', 'zy') ]
try:
# 执行sql语句
cursor.executemany(sql, val)
# 提交到数据库执行(数据表内容有更新,必须使用到该语句)
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
查询数据
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象。
- fetchall(): 接收全部的返回结果行。
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
cursor = db.cursor()
cursor.execute("SELECT * FROM user")
myresult = mycursor.fetchall() # fetchall() 获取所有记录
for x in myresult: print(x)
更新数据
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
try:
# 执行sql语句
cursor.execute(UPDATE user SET name = %s WHERE Id = %s", ('king', '4'))
# 提交到数据库执行(数据表内容有更新,必须使用到该语句)
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
删除记录
我们编写删除语句通过DELTE FROM
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='user',
password='password',
database='db')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
try:
# 执行sql语句
cursor.execute(DELETE FROM user where id = '1')
# 提交到数据库执行(数据表内容有更新,必须使用到该语句)
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
cursor.execute("SELECT * FROM user")
myresult = cursor.fetchall() # fetchall() 获取所有记录 for x in myresult: print(x)
# 关闭数据库连接
db.close()
事务
对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
commit()
方法游标的所有更新操作rollback()
方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。
可以看到前面对数据库数据会产生变化的,都手动提交了事务。遇到异常进行回滚操作。
总结
可以发现PyMySQL和mysql-connector的操作基本上是一样的。
pymysql.connect()
:创建数据库连接对象。db.cursor()
:获取数据库的操作对象mycursor.execute(sql, parameters)
:来运行sql,第二个参数为元组- 为了防止数据库查询发生 SQL 注入的攻击,我们可以使用
%s
占位符 mycursor.executemany()
:执行多条sql操作mydb.commit()
:提交事务mycursor.fetchall()
:执行为查询SQL后,获取全部的记录mycursor.fetone()
:执行为查询SQL后,获取一条的记录
更详细的API可以查看官方文档。
转载自:https://juejin.cn/post/7365903656166014986