
mysql与python的交互
PYTHON与MYSQL的交互
一、PYTHON模块安装与数据库连接
1.安装模块
要使用Python连接MySQL数据库,需要安装一个用于驱动MySQL的工具pymysql。
pymysql是一个用于连接与操作MySQL数据库的开源模块。 安装pymysql非常简单,在终端中输入代码:pip install pymysql
即可。
如果无法安装或安装缓慢,可以换源进行加速:
1 | pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
安装完pymysql模块后,下一步就是在 Python 程序中导入这个模块。
1 | # TODO 导入pymysql |
2.连接数据库
在pymysql中连接数据库时,依旧需要指定地址、端口、账号与密码。
大部分情况下,只需要对某一个特定的数据库操作,此时还可以指定数据库名。
代码如下:
1 | import pymysql |
二、游标创建与操作
游标(或光标)是一种处理数据的工具,它能够标注出一行或多行数据,方便修改或显示。
执行SQL查询时,若查询成功,会返回一到多行数据。这些数据称为结果集。在结果集生成的同时,SQL会创建一个游标,并处于结果集的第一行数据之前。在默认情况下,游标会直接读取该位置之后的所有行数据并输出。直到游标后没有新的数据,游标停止移动,并自动关闭。
1.游标的意义
游标可以帮我们记录读取数据时要开始的位置和要结束的位置。
除了一次性输出所有数据外,若想要结果集中的数据:
第一次显示1行;
第二次显示4~5行;
第三次显示6行。
这样交互式的输出。可以通过控制游标的移动规则来实现。
2.游标的移动
获得结果集后,可以控制游标读取3行数据后停止。
- 第一次的规则为读取游标后三行。则游标从第一行开始,到第三行数据后停止。这时,游标经过的三行数据会被直接输出。
- 移动后的游标此时停止在第四行数据之前。再次控制游标移动,这一次让游标读取2行数据后停止,就能获取结果集中的4~5行数据并输出。
3.创建与关闭游标
- 为当下的连接创建一个游标,需要使用cursor。调用 cursor 时需要使用句点法,即连接变量名.cursor(),且不需要传递参数。
- 创建游标也会占用系统资源,所以当停止使用游标时,需要使用close关闭。
1 | import pymysql |
4.对游标的操作
4.1第一步,利用游标执行SQL语句
执行SQL语句需要使用游标的execute()方法。
需要把SQL语句作为参数,传递给execute。
要在Python中执行SQL,需要将SQL代码以字符串的形式传递。
文档字符串的应用:SQL代码中可能存在单引号或双引号 ,这与Python字符串的符号规则相同。这可能造成引号无法正确识别并匹配的问题。
为了避免引号匹配的错误,可以通过三个引号组成的多行字符串存储SQL代码。
这样的字符串又称为文档字符串。
文档字符串的引号可以由三个单引号或三个双引号组成,它能够保留字符串内的换行信息。
接下来,若想要获取表中的所有内容,可以使用 SELECT * FROM brand; 。
创建一个变量来存储这段SQL代码,为了避免出错使用文档字符串。
1 | SQL = ''' |
执行SQL代码:
1 | ret = cur.execute(SQL) |
数据库接收到SQL代码后会尝试查询。若查询成功,execute 返回查询出了多少行数据;
若SQL代码错误、查询失败,则程序会报错。将这一返回值存储到变量中并输出,方便查看结果。
4.2 fetch方法
SQL 执行成功后,游标会获得查询后的结果集。
在pymysql中,cursor 提供系列的 fetch 方法,用来控制游标从结果集中读取内容。
对于游标获取到的结果,我们可以通过三种方式抓取数据:
从当前位置开始获取一行数据,fetchone();
从当前位置开始获取多行数据,fetchmany(n),n为获取的行数;
从当前位置开始获取所有的数据,fetchall();
fetchone
游标提供一个fetchone方法,能够从当前位置获取一行数据。
该方法没有参数,只需要通过 游标变量.fetchone() 的方式调用。
fetchone 执行结束后,会将获取到的数据返回为一个元组。
该元组会存储这一行的每一个值,可以把它存储到变量data中。
1
2data = cur.fetchone()
print(data)当 fetchone 执行结束后,游标会自动向下移动。这样,再次执行fetchone时,获取到的就是新的数据。
fetchmany
若想从游标的当前位置获取指定行数的数据,可以使用fetchmany方法。
fatchmany接收一个整数作为参数,用来指定要返回的行数;
通过 游标名.fetchmany(要读取的行数) 的方式调用。
同样的fetchmany会将读取到的数据返回为元组,但因为获取到的是多行数据。所以会以嵌套元组的形式存储。可以将这部分结果存储到变量中。
1
2data = cur.fetchmany(4)
print(data)fetchall
若想从游标的当前位置开始获取所有的数据,可以使用fetchall方法。
fetchall 不需要设定参数,它会控制游标移动直到所有数据读取结束。
通过 游标名.fetchall() 的方式调用。
大部分情况下 fetchall 会读取多行数据,这些数据也会以嵌套元组的形式存储。
例如brand 表中有21条数据,若直接执行fetchall,就会获得存储了21条数据的嵌套元组。可以将这部分结果存储到变量中。
1
2data = cur.fetchall()
print(data)在实际应用中,通常会将查询结果中的数据全部输出,即 fetchall 的是最常用的方法。
因为结果存储在嵌套元组,在获取数据时需要先指定行所在的索引,再指定某一值所在的索引。
1
2
3
4
5
6
7
8
9
10
11
12data = ((200001, '香奶奶'),
(200002, '雅诗绿黛'),
(200003, '绿蔻'),
(200004, '百世'),
(200005, '三只仓鼠')
)
# 查询第4行
row4 = data[3]
print(row4)
# 查询第4行的第2列
row4c2 = data[3][1]
print(row4c2)