前言
python2时,连接数据库MySQL的库叫MySQLdb,但是MySQLdb不支持python3,所以自己找了一下,找到了pymysql,这个库可以当作python3的MySQLdb库,与MySQLdb的操作也非常相似。
首先,你得安装MySQL,自己之前的教程有写,这里给出链接:
https://blog.csdn.net/Ans_min/article/details/94360764
(PS:SQL Server与MySQL端口号不同,所以他们两不会互相干扰)
pymysql 的使用
导入
import语句,这个就不细说了,应该都懂import pymysql
如果想看看自己是否已经下载了该库,可以在pycharm进入终端,输入pip list
查看。(或者去cmd输入pip list
也行,都是可以的)
导入遇到的问题
自己电脑上通过pip install
下载了pymysql
,但是导入仍显示no module named pymysql
(就是pycharm会在错误语句下面显示红色波浪线),自己在网上找了找解决方法,结果其他博文都没有说具体,这里我讲一下pycharm的解决方法:
把鼠标放在红色波浪线标注的地方,过一会就会出来no module named pymysql
的框子,选择左下的Install package pymysql
(下面的图是以panda为例的,因为我之前pymysql点过了,不好复原截图)
建立连接
连接是需要用到connection()方法,括号中参数如下:
- host: 数据库主机名,默认是用本地主机
- port: MySQL服务使用的TCP端口,默认是3306,数字类型
- user: 数据库登陆名,默认是当前用户
- password: 数据库登陆的秘密,默认为空
- db: 要使用的数据库名没有默认值
- charset: 数据库编码,注意utf-8要写成utf8
可以看出,connect连接必须要连接数据库(因为没有默认值,必填),所以我们先去创建一个数据库。(下面给出来两个方法)
命令行创建
命令行这里我们以创建数据库test,和test1表为例,首先打开cmd(Win+R,输入cmd,回车进入)
然后登陆MySQL,
mysql -u root -p
,输入密码,回车进入;
然后输入
create database test;
(创建数据库test),test可以换成其他名字;
为了大家方便进行一些误操作的后续指令:
- 删除数据库:
drop database 数据库名;
- 查看所有数据库:
show database;
- 选择数据库:
use 数据库名
(确保接下来的操作的对象是哪个数据库)
创建表,表中有两列,一列是stuNo(类型: varchar(10)),一列是stuName(类型: varchar(20))
然后我们放一个数据进去就好。
insert into 表名 (stuNo, stuName) values ('2018112222', 'zm');
当然,我们截止中分了几行来写的
然后两次
exit
退出就好。
Navicat创建
Navicat 可以实现图形化界面操作MySQL,比命令行肯定要方便直观。不过就是要先下载,之前博文写过安装,给出链接:
https://blog.csdn.net/Ans_min/article/details/103619179
大家安装好并连接了MySQL就可以继续操作了。打开Navicat(我们可以看到我们刚才在cmd里面创建的数据库和相应的表)
接下来我们就用Navicat创建dmq_database和其中nameList表;
输入数据库名,其他默认就好;
双击刚刚创建的数据库,然后选择右边的新建表
然后这里我们把要创建的列都规定好之后,点击保存,会弹出设置表名的框子,我们输入表名,然后确定即可;
我们双击进入表,写入一条信息。
好,创建好数据库之后,我们接着创建连接。直接给出代码,解释在注释中。
import pymysql
# 完整的参数格式为connect(host='localhost', port=3306, user='root', password='123', db='test', charset='utf8')具体解释前文已经解释过了
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='test') # 建立连接
cur = conn.cursor() # 定位
cur.execute('select * from test1') # 传递SQL语句(还没获得数据)
data = cur.fetchall() # 获取查询到数据(如果没有就获取不到数据)
print(data) # 输出
cur.close() # 关闭
conn.close() # 关闭
print('-'*30)
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='dmq_database')
cur = conn.cursor() # 定位
cur.execute('''insert into nameList (stuNo, stuName)
values ('2019112222', 'wzw')''') # 传递SQL语句(只是单纯的传递)
conn.commit() # 执行execute的SQL命令(不写就不执行)
cur.execute('select * from nameList') # 传递SQL语句(也只是单纯的传递)
data = cur.fetchall() # 获取查询到数据(如果没有就获取不到数据)
print(data) # 输出
cur.close() # 关闭
conn.close() # 关闭
需要注意的地方
-
上述代码中,connect括号里的值要看你自己MySQL的用户、密码等相关属性填写,不能照抄;
-
如果表名、数据库名不同,下面的
execute()
也需要同步改变。 -
还要强调的一点就是,
execute
只是起到python程序和MySQL之间的数据传递,没有其他作用,如果想获取到还需要connect对象
调用fetchall()
,想让MySQL执行SQL命令,就需要connect对象
调用commit()
,不能少。
connect和cursor
我们再来说说,connect和cursor对象的常用方法
connect
像代码中的conn就是新建的connect对象,可以把它理解成在Python程序和MySQL数据库之间的桥梁,没它就没有后面的沟通(一系列数据操作)。
connect对象有一些自带方法,这里我们也给出:
- commit() 提交当前事务(比如前面一行代码写的是通过
cursor.execute()
传输insert写入命令,这个就可以当作一个事务,然后我们紧跟着写commit()
,SQL就开始执行) - cursor() 创建并返回游标(游标介绍cursor的时候在细说)
- rollback() 回滚当前事务
- close() 关闭connect连接,就是把唯一的桥炸了
关于rollback()
回滚的目的是保证sql语句的部分操作错误导致部分数据改变而没有全部改变,最后运行正确时,又把已经处理过的数据再进行处理。
举个例子:
现在数据库中一个成绩表scorelist,有张三和李四两个人的姓名和成绩两列。现在我们想执行update
语句,使张三和李四的成绩都-20
,那我们写入execute("update scorelist set score=score-20 where name='张三'")
和execute("update scorelist set score=score-20 where name='李四'")
两条语句,然后执行rollback()
回滚。我们知道,这样就可以成功更新两个元组内的数据,但是,我们假如第二句写错了,表名写成scorelists
,导致python程序报错,如果我们没用回滚,那么第一条execute传递过来的SQL语句执行成功,第二条失败。但是你自己看到python报错就默认SQL语句都没有成功执行,然后找出SQL语句中的错误,又运行了一遍,这时虽然成功了,但是,张三他的分数被扣了两遍20分。用rollback()回滚
就会让MySQL自动实现事务回滚,避免这一问题。
cursor
常用方法:
- close(): 关闭此游标对象
- fetchone(): 得到结果集的一行数据
- fetchmany(size): 得到结果集的
size
行数据 - fetchall(): 得到结果集中剩下的所有行,相当于全部数据
- excute(sql): 传递一个数据库查询或命令
- excutemany(sql, args):执行多个数据库查询或命令
关于execute
只是单纯的传递。查询不返回数据,返回数据就要用到fetch%
(%可以替换成one、many、all);执行命令还需用到connect.commit()
,不然不会执行
最后
当然,最后还是要说下,connect和cursor对象用完都要关闭close()
,原因和Python文件操作最后需要关闭的原因相同。
看完文章,如果觉得有用,记得点赞 >▽<