python操作数据库
通过pymysql模块连接
一、连接对象:
1、获取连接对象:
获取连接对象主要通过connect()函数,此函数有多个参数,具体使用哪个参数, 要看使用的数据库类型。connect()函数常用参数和说明如下:
| 参数 | 说明 |
| dsn | 表示数据源名称 |
| user | 用户名 |
| password | 用户密码 |
| host | 主机名 |
| database | 数据库名称 |
示例代码如下:
conn = pymysql.connect(host="localhost",user="user",password="passwd",db="database",charset="utf-8")
2、连接对象的方法:
connect()函数返回连接对象,这个对象表示目前和数据库的会话,连接对象支持的方法如下:
| 方法 | 说明 |
| close() | 关闭数据库连接 |
| commit() | 提交事务 |
| rollback() | 回滚事务 |
| cursor() | 获取游标,操作数据库 |
二、游标对象:
游标对象代表数据库中游标,用于指示抓取数据操作的上下文,主要提供执行SQL语句、调用存储过程,获取查询结果等方法。
通过使用连接对象的cursor()方法可以获取游标对象,游标对象的属性如下:
- description:数据库列类型和值的描述信息。
- rowcount:返回结果的行数统计信息,如select、update等。
游标对象的方法如下:
| 方法 | 说明 |
| callproc(procname,parameter) | 调用存储过程,需要数据库支持 |
| close() | 关闭当前游标 |
| execute(operation,parameter) | 执行数据库操作,sql语句或数据库命令 |
| fetchone() | 获取查询结果集中的下一条记录 |
| fetchmany(size) | 获取指定数量的记录 |
| fetchall() | 获取结果集的所有记录 |
| nextset() | 跳至下一个可用的结果集 |
| arraysize | 指定使用fetchmany()获取的行数,默认为1 |
| setinputsizes(sizes) | 设置在调用execute()方法时分配的内存大小 |
| setoutputisizes(sizes) | 设置缓冲区大小,对大数据列(LONGS)有用 |
| executemany() | 用于批量操作,如批量更新 |
三、连接mysql数据库:(mysql安装方法省略)
连接MySQL需要支持Python的mysql驱动来进行连接,在此选用PyMysql数据库模块来连接MySQL,安装PyMySQL可直接使用pip安装即可,如下:
pip3 install PyMySQL
1、例如:通过pymysql模块连接数据库,编辑mysql.py模块,如图:

执行结果如下:

2、创建数据表:
例如:修改上述的mysql.py模块,通过预处理语句创建表,如图:

3、操作数据表:
例如:向表中插入单条数据,先将表中内容清空,再插入数据,通过try来捕获异常,如图:

插入多条数据,使用executemany()方法,如图:

通过MySQL官方驱动连接
mysql-connector是MySQL官方提供的驱动器,使用的时候直接使用pip安装即可,如图:

安装后在终端界面导入不报错,说明已经安装成功,如图:

连接mysql主要需要四部分信息:
- 运行MySQL的机器信息
- 连接MySQL的用户名
- 连接MySQL的用户密码
- 需要连接的MySQL的库名
1、定义连接属性,如下:

- host:MySQL服务所在的主机
- user:连接MySQL的用户名
- password:连接MySQL的密码
- database:要连接的库
2、导入MySQL驱动,如下:

3、建立与服务器的连接,如下:
conn = mysql.connector.connect(**db_config)
注意:db_config前面有个**,这个的含义不是指针,Python中没有指针概念,**的含义是使用一个变量提供了一个参数字典,connect会把这个参数字典展开为4个单独的参数,然后使用这些参数来连接MySQL
4、打开一个游标,如下:
cursor = conn.cursor()
要想向数据库发送命令已经从数据库接收返回结果,需要创建一个游标,创建游标只需要调用cursor()方法即可
5、执行SQL查询,如下:

一般建议使用三引号来包含要发给MySQL的命令,因为三引号可以换行,如果语句过长可以换行,然后赋值给一个变量_sql(这个变量不一定非要以下划线开头,只是可以建议这么写)
执行cursor.execute(_sql)将要执行的命令发送给MySQL
使用一下三个游标方法可以获取请求结果,如下:
- cursor.fetchone:获取一行的结果
- cursor.fetchmancy:获取指定的任意行结果
- cursor.fetchall:获取全部结果,返回的是一个参数为元组的列表,可使用for循环遍历
6、提交缓存数据以及关闭游标和连接,执行命令如下:
conn.commit()
cursoe.close()
conn.close()
不在需要连接的时候就可以关闭游标和连接,否则会过度消耗服务器资源,conn.commit()不是一定要写,如果我们向数据库中插入数据,此时数据并没有真正的插入的数据库中,而是在缓存里,如果此时查询数据可能会出现查询不到的情况,如果要想插入后立即就能查询到,那么只能强制将缓存数据写入数据库中,此时就需要调用conn.commit(),不过此命令会稍微耗费性能,如果不太在乎性能并且需要即可查询数据,就用此命令即可
下面例子表示向MySQL中插入数据,如图:

上图中的插入语句中并没有用硬编码的字符串插入,而是使用格式化占位符%s,这样更灵活,然后在execute中插入数据,execute这个函数只能接收两个参数,第一个参数为要执行的命令,第二个参数就是要插入的数据,这里将数据全部放在一个元组中,这样即可实现顺利插入,如图:



