python3连接MySQL

前言

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()    # 关闭

在这里插入图片描述

需要注意的地方

  1. 上述代码中,connect括号里的值要看你自己MySQL的用户、密码等相关属性填写,不能照抄;

  2. 如果表名、数据库名不同,下面的execute()也需要同步改变。

  3. 还要强调的一点就是,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文件操作最后需要关闭的原因相同。

看完文章,如果觉得有用,记得点赞 >▽<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值