python之pymysql库学习笔记

  • List item

前言

有没有遇到过这样的情况,程序写好了,但是当我们程序运行结束关闭,在重新打开时,之前的数据就已经消失了。在一开始学习python不久后,尤其是做猜拳游戏的时候、或者成绩管理系统,当你重新运行程序后,之前的数据全部消失了。我就想能不能让数据永久的保存起来,但是似乎是一件非常困难的事情。

然后随着学习,了解到了更多知识,数据库。顾名思义就是保存数据,那为什么叫数据库呢?

然后最近在做一个东西,就需要把数据存放到数据库。但是我又没有学过数据库。只是对数据库有所了解。然后网上看到了一些案例,用python连接数据库进行操作,一看就python,这个我熟悉啊。然后就点进去了,学习一下,写一篇博客。学习笔记。

pymysql库

pymysql库介绍

pymysql库是什么,看这个名字可以看出是去python的前两个字母和mysql的结合,

MySQL是什么,有名的数据库(目前在我眼里是很有名气的)

py + MySQL = pymysql:意思就是python与MySQL数据库交互用的。

正如我现在做的一个 项目,我想把数据存到数据库里面。

推荐一个学习网址,可以看一下。[Python3 MySQL 数据库连接 – PyMySQL 驱动 | 菜鸟教程 (runoob.com)]

pymysql库安装

这是一个第三方库,我仅提供Windows + pip 的下载方式。

pip install pymysql

准备工作

对pymysql库介绍之后,我们就该想怎么使用了。但是在使用之前,还有一些事情需要明确一下

  1. 安装MySQL数据库,知道账户及密码。

  2. 创建数据库:test

    create database 数据库名 charset=utf8;
    create database test charset=utf8;  # 创建test数据库
    

    数据库创建语句,指定字符集utf8。

  3. 因为我对MySQL不熟悉,只是一时需要,大家可以与菜鸟教程对照着看SQL 教程 | 菜鸟教程 (runoob.com)

  4. 推荐使用MySQL可视化工具

pymysql使用流程

  1. 连接数据库
  2. 创建游标
  3. 执行sql语句
  4. 关闭游标、数据库

1,连接数据库

db = pymysql.connect(host='localhost',  # 数据库IP地址,本机:localhost
                     user='root',  # 用户名
                     password='xxxxx',  # 密码
                     database='test')  # 数据库

总结两个数据库连接错误的报错信息

pymysql.err.OperationalError: (1049, "Unknown database 'test1'")
# 没有test1数据库。

pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
# 密码或用户名错误。
  • pymysql.connect()函数

    单词connect有连接,相通的意思,顾名思义就是要让python与MySQL连接、相通啦。因为参数众多,我将会介绍几个比较重要的参数,供我们做一个小项目。

    参数(类型)说明
    host数据库ip地址
    post端口号, 默认3306
    user数据库用户名
    password数据库密码
    database指定的数据库名称
    charset字符集

说明几点,

  • 有些参数属于可选参数,

  • 其次是我的host='localhost' 这是因为我的数据库就在我的本地环境。因而’localhost’表示连接本地服务

    我去搜索了一写怎么查看数据库的IP地址。好像有好多种方法,我试了几个都是localhost,不敢确定对不对,但是如果就是在本机上进行连接交互(不包括虚拟机)。localhost完全可以应付。

  • 端口号: post=3306

  • 字符集:charset = ‘utf8’

2,创建游标

cur = db.cursor()

什么是游标呢?意思就是光标。

3,相关函数

直到这里,已经完成了数据库的连接与游标的创建,接下来我介绍几个常用到的几个函数。

函数介绍
.execute()执行单条sql语句。
.executemany()执行多条sql语句
.fetchall()从数据库中提取元素。
db.commit()提交
cur.close()关闭游标
db.close()关闭数据库
.rollback()回滚

增删改查

创建表

  • MySQL语法

    CREATE TABLE <表名> (字段名 字段类型);
    
    CREATE TABLE students(
              student_id INT  NOT NULL,
              name CHAR(20) NOT NULL,
              email CHAR(20) NOT NULL);
    

    这是一个基本格式,创建一个学生信息表,有三个字段student_id 整数型;name 字符型型 ;email 字符型 都设置的是不可以为空。

    NOT NULL :非空约束, 不可以为空,否则报错。

    INT :整数型

    CHAR(20) :字符型,可以存储20个字符

  • pymysql语句

    # 创建表
    cur.execute('drop table if exists students')  # 检查表是否存在,如果存在删除
    sql = """ CREATE TABLE students(
              student_id INT  NOT NULL,
              name CHAR(20) NOT NULL,
              email CHAR(20) NOT NULL)"""
    
    cur.execute(sql)  # 执行sql语句
    cur.close()  # 关闭游标
    db.close()  # 关闭数据库连接
    
    drop table if exists students;
    

    很明显,这是一个MySQL语句。什么意思呢?看看是否存在这个表,存在,删除。

    因为我们处于学习阶段,为了保存表的干净,运行,删除表,创建新的。

    然后就可以在这个数据库里面查看第一张数据表。就可以在数据库里面查看表和表的结构

    show tables;  # 显示表语句
    desc students;  # 查看表结构
    

插入数据

MySQL语句

我们先看看在MySQL中插入数据的语句

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

插入一个学生的数据

INSERT INTO students
(student_id, name, email) 
VALUES
(1, '小明', '123@163.com');

pymysql语句

execute() 提交单条数据
方式一
# 添加数据
sql = " INSERT INTO students(student_id, name, email) VALUES('%d','%s','%s') " % (1, '小明', '123@163.com')
cur.execute(sql)  # 执行sql语句
db.commit()  # 提交

cur.close()  # 关闭游标
db.close()  # 关闭数据库连接
" INSERT INTO students(student_id, name, email) VALUES('%d','%s','%s') " % (1, '小明', '123@163.com')

值得说明一点,这里用到了python的字符串拼接,当然也可以用我比较熟悉的str.format()

" INSERT INTO students(student_id, name, email) VALUES('{}','{}','{}') ".format(2, '小刚', '456@163.com')

但是要注意VALUES('{}','{}','{}') 这个地方的'{}' ,我一直写成了{} 老是有报错,然后print 一下发现了区别。

之后还是要注意这个地方,这里必须是元组类型。为什么是元组类型,我有如下猜测,在我学习的时候无意中发现了一个名词,sql注入。大致的意思就是防止没有必要的数据进行插入。而元组类型的特点就是创建后不可以修改

方式二
data = (2, '小刚', '456@163.com')  # 数据
sql = " INSERT INTO students(student_id, name, email) VALUES(%s, %s, %s) "

cur.execute(sql, data)  # 执行sql语句
db.commit()  # 提交

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

注意这里与方式一有些不同cur.execute(sql, data) 如果方式一需要我们手动拼接字符串,那么方式二就是自动拼接。

但要注意元组里面的变化。

executemany() 提交多条数据
data = [(1, '小明', 'xiaoming@163.com'), (2, '小王', 'xiaowang@163.com'), (3, '小明', 'xiaoming@163.com'),
         (4, '小李', 'xiaoli@163.com'), (5, '小红', 'xiaohong@163.com')]
# 添加数据
sql = " INSERT INTO students(student_id, name, email) VALUES(%s,%s,%s) "
cur.executemany(sql, data)  # 执行sql语句
db.commit()  # 提交

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

注意,这里用的又和前面的不一样。cur.executemany(sqlQuery, data) 把多条数据打包成了一个列表。然后运行。一开始我还打算for循环然后添加数据,没必要。

以上介绍了两种添加数据的方式

删除数据

  • MySQL语法

    DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]  # 删除指定数据
    DELETE FROM <表名>  # 删除全部数据
    
  • pymysql语句

    sql = "DELETE FROM students WHERE name=%s"
    value = ('张三')
    cur.execute(sql, value)
    db.commit()
    

    这个是什么意思呢,删除students表中name为张三的数据。

    如果是删除指定的id,或者Email字段,则

    sql = "DELETE FROM students WHERE name=%s" %("小刚")
    

    注意!!!这里写成这个格式会报错。

    sql = "DELETE FROM students WHERE student_id=%s"  # 指定学号
    sql = "DELETE FROM students WHERE email=%s"  # 指定邮箱
    

    删除全部数据

    sql2 = " DELETE FROM students "
    cur.execute(sql2)
    db.commit()
    

修改数据

  • MySQL语法

    UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
    [ORDER BY 子句] [LIMIT 子句];
    
  • pymysql语句

    sql = "UPDATE students SET name=%s WHERE name=%s"
    value = ('张三', '李四')
    cur.execute(sql, value)
    db.commit  
    

    注意这里('张三', '李四') 把名字为李四的数据改成张三,如果没有李四,那么,不报错,也不更改数据。

    sql_UPDATE = "UPDATE students SET name=%s, email=%s WHERE name=%s"
    value = ('张三', 'zhangsan@163.com', '小红')
    cur.execute(sql_UPDATE, value)  # 执行sql语句
    

    与上面代码是一个意思,

查找数据

mysql语句

SELECT * FROM 表名;  # 查找全部数据
SELECT * FROM 表名 WHERE 条件;

pymysql语句

查找全部数据

# 全部数据
sql = "SELECT * FROM students"
cur.execute(sql)
res = cur.fetchall()
print(res)  # 元组类型,需要遍历

注意这里用到了一个fetchall() 方法,从数据库中提取数据。但是返回的是一个元组类型,一行数据一个小元组,外面是个大元组。这时循环遍历一下就好了。

按条件查找数据

# 按条件查找数据
sql = "SELECT * FROM students WHERE name=%s"
cur.execute(sql, '小刚')
res = cur.fetchall()
print(res)

整理与优化

以上内容就是连接数据库,进行增删改查一系列操作,但是这不符合python的特点,简洁,难不成需要的时候重复写 好几遍代码?现在,我看看能不能写成函数,供大家参考。

总结

到这里,基本就结束了。但是我发现了许多问题

pymysql库一开始我以为很难,其实记住几个函数就可以了,连接数据库connect() 、创建游标cursor()、执行sql语句execute()executemany、查找数据fetchall()、关闭close()

然后我们再说说执行sql语句。其实执行的都是mysql语句,在这里完全把python当成了工具,让python帮我执行sql语句。虽然我没有接触MySQL,百度一下关于MySQL的增删查改语句,就这样也就可以了。

数据库,虽然没有接触过,但我了解过,主键、外键,这些事情怎么做,因为我完全不懂sql语句呀,就感觉这个不友好。我一直在写flask,一边用pymysql,一边寻找新的方法。然后我又发现了一个python连接数据库的方法,flask_sqlalchemy库,这个相比pymysql,完全没有一丁点sql语句,只要你会python,完全就可以应付。

同时我也会对flask_sqlalchemy库的学习做一篇笔记,欢迎大家访问。

好了,我的学习笔记到此结束。

里面肯定有许许多多的bug,欢迎大家指出!毕竟这样成长更快。

也感谢大家可以看到这样,如果帮到了你,是我的荣幸。

谢谢大家!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值