PyMySQL库简单介绍

PyMySQL是在Python3.x版本中用于连接和操作MySQL服务器的一个第三方库
MySQLDB是在Python2.x版本中用于连接和操作MySQL服务器的一个第三方库
由于Python2.x将逐步被Python3.x取代,此处我们主要学习PyMySQL的使用

PyMySQL库下载安装

// 默认从官网下载安装PyMySQL库
pip3 install pymysql
// 从豆瓣源下载安装PyMySQL库
pip3 install pymysql -i https://pypi.douban.com/simple
// 从清华源下载安装PyMySQL库
pip3 install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple

PyMySQL数据库操作

# 1、连接数据库
# -*- coding:utf-8 -*-
import pymysql

# 创建连接,返回一个指定配置的数据库连接对象
conn = pymysql.connect(
    host = "127.0.0.1",   # 数据库服务端IP地址        
    port = 3306,          # 数据库服务端端口
    user = "root",        # 用户
    password = "123456",  # 密码
    database = "ums",     # 数据库名
    charset = "utf8",     # 编码格式
    # autocommit = True     # 自动提交,但不建议
)
# 手动提交数据,另外创建连接时可以配置自动提交(不建议自动提交,因为多表操作事务)
conn.commit()
# 主动关闭连接,另外连接超时时也会被动关闭连接(不建议被动关闭,可能出现意外报错)
conn.close()
# 2、数据库游标
# 1.默认游标Cursor类型,执行查询操作时结果为元组格式数据
# 如:((1, '超级用户'),(2, '普通用户'))
cursor_tup = conn.cursor()
# 2.指定游标DictCursor类型,执行查询操作时结果为字典格式数据
# 如:({'id':1, 'name': '超级用户'},{'id':2, 'name': '普通用户'})
cursor_dic = conn.cursor(cursor=pymysql.cursors.DictCursor)

PyMySQL数据表操作

# 1、新增数据
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
# 1.新增单条数据
query = "insert into user (username, password, role_id) values ('user16', 'u016', 2)"
# 执行SQL,返回受影响的行数
count = cursor.execute(query=query)  
query = "insert into user (username, password, role_id) values (%s, %s, %s)"
# 执行SQL,格式化SQL参数,返回受影响的行数
count = cursor.execute(query=query, args=('user17', 'u017', 2))  
# 提交之后,获取刚插入受影响的行数
row_count = cursor.rowcount
# 提交之后,获取刚插入的数据的ID
last_id = cursor.lastrowid

# 2.新增多条数据
query = "insert into user (username, password, role_id) values ('user18', 'u018', 2),('user19', 'u019', 2)"
# 方式一:执行SQL,返回受影响的行数
count = cursor.execute(query=query) 
query = "insert into user (username, password, role_id) values (%s, %s, %s)"
# 方式二:执行SQL,格式化SQL参数,返回受影响的行数
count = cursor.executemany(query=query, args=[('user20', 'u020', 2), ('user21', 'u021', 2)])
# 方式一:提交之后,获取刚插入受影响的行数
row_count = cursor.rowcount 
# 方式二:提交之后,获取刚插入的数据的ID
last_id = cursor.lastrowid

# 3.提交数据,关闭游标,关闭连接
conn.commit()
cursor.close()
conn.close()
# 2、删除数据
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
# 方式一:执行SQL,返回受影响的行数
delete = "delete from user where id=9"
count = cursor.execute(query=delete)
# 方式二:执行SQL,格式化SQL参数,返回受影响的行数
delete = "delete from user where id=%s"
count = cursor.execute(query=delete, args=[10])
# 提交之后,获取刚删除受影响的行数
row_count = cursor.rowcount 
# 3、修改数据
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
# 方式一:执行SQL,返回受影响的行数
update = "update user set username='user70' where id=7"
count = cursor.execute(query=update)
# 方式二:执行SQL,格式化SQL参数,返回受影响的行数
update = "update user set username='user80' where id=%s"
count = cursor.execute(query=update, args=[8])
# 提交之后,获取刚插入受影响的行数
row_count = cursor.rowcount 
# 4、查询数据
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
query = "select * from user limit %s"
# 参数1:SQL语句;参数2:SQL语句格式化参数
count = cursor.execute(query=query, args=(10,))
# 获取单条结果,注意每次取出一条数据,游标对象的rownumber属性值+1,下次在该基础上取下一条数据
data_one = cursor.fetchone()
# 获取刚查询结果的行数,获取刚查询数据后的标记行数
row_count = cursor.rowcount
row_number = cursor.rownumber

# 获取n条结果,注意每次取出n条数据,游标对象的rownumber属性值+n,下次在该基础上取下一条数据
data_n = cursor.fetchmany(3)
# 获取刚查询结果的行数,获取刚查询数据后的标记行数
row_count = cursor.rowcount
row_number = cursor.rownumber

# 获取剩余全部结果,注意游标对象的rownumber属性值达到最大,下次查询结果为空
data_rest_all = cursor.fetchall()
# 获取刚查询结果的行数,获取刚查询数据后的标记行数
row_count = cursor.rowcount
row_number = cursor.rownumber

#  获取查询结果的字段简介集,可以得到对应的字段列表
#  如:(('id', 3, None, 11, 11, 0, False), ('username', 253, None, 255, 255, 0, True)...)
cols_desc = cursor.description
columns = [desc[0] for desc in cols_desc]

cursor.close()
conn.close()

PyMySQL数据库事务

# 1、事务回滚
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
# 使用场景:A表和B表相互依赖,要么同时成功,要么同时失败 
try:
    count = cursor.execute(
        query="insert into role  (`name`, `desc`) values (%s, %s)", args=('管理用户', '拥有部分权限'))
    last_id = cursor.lastrowid
    count = cursor.execute(
        query="insert into user (username, password, role_id) values (%s, %s, %s)", args=('user22', 'u022',))
    last_id = cursor.lastrowid
    conn.commit()
except Exception as error:
    conn.rollback()  # 执行异常,事务回滚
cursor.close()
conn.close()
# 2、游标调节
import pymysql
# 连接数据库
conn = pymysql.connect(
    host='数据库地址', 
    user='用户',
    password='密码',
    database='数据库名',
    charset='utf8'
)
cursor = conn.cursor()  # 获取游标
# 注意,如果有多条获取查询的语句,游标会从上一次的位置开始查询
# 比如说如果有两条 cursor.fetchall()   那么第二次查询结果为空
# 可以用cursor.scroll()方法来控制游标
print(cursor.rownumber)  # 0
count = cursor.execute("select * from user")
data_all = cursor.fetchall()
print(cursor.rownumber)  # 15
cursor.scroll(0, mode='absolute')  # 移动到绝对位置0,即第一行的位置
print(cursor.rownumber)  # 0
data_n = cursor.fetchmany(10)
print(cursor.rownumber)  # 10
cursor.scroll(1, mode='relative')  # 移动到相对位置,当前行的下一行
print(cursor.rownumber)  # 11
cursor.scroll(-1, mode='relative')  # 移动到相对位置,当前行的上一行
print(cursor.rownumber)  # 10
posted on 2022-01-27 14:27  码农青葱  阅读(170)  评论(0)    收藏  举报