- 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库介绍之后,我们就该想怎么使用了。但是在使用之前,还有一些事情需要明确一下
-
安装MySQL数据库,知道账户及密码。
-
创建数据库:
test
create database 数据库名 charset=utf8; create database test charset=utf8; # 创建test数据库
数据库创建语句,指定字符集utf8。
-
因为我对MySQL不熟悉,只是一时需要,大家可以与菜鸟教程对照着看SQL 教程 | 菜鸟教程 (runoob.com)
-
推荐使用MySQL可视化工具
pymysql使用流程
- 连接数据库
- 创建游标
- 执行sql语句
- 关闭游标、数据库
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('{}','{}','{}')
这个地方的'{}'
,我一直写成了{}
老是有报错,然后之后还是要注意这个地方,这里必须是元组类型。为什么是元组类型,我有如下猜测,在我学习的时候无意中发现了一个名词,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,欢迎大家指出!毕竟这样成长更快。
也感谢大家可以看到这样,如果帮到了你,是我的荣幸。
谢谢大家!