pymysql的使用

时间:2021-11-02 03:29:45

数据库开发

驱动

MySQL基于TCP协议之上开发,但是网络连接之后,传输的数据必须遵循MySQL的协议.封装好MySQL协议的包,就是驱动程序.

MySQL的驱动

连接connect

先建立一个数据传输的数据通道--连接.

pymysql.connect()方法返回的是connections模块下的connection类实例.

connect方法传参就是给connection类的__init__提供参数

connection初始化参数 说明
host 主机
user 用户名
password 密码
database 数据库
port 端口

connection.ping()方法,测试数据库服务器是否存活,有一个参数reconnect表示断开与服务器连接是否重连.

游标cursor

操作数据库,必须使用游标,首先要获取一个游标对象.

connection.cousor(cursor=none)方法返回一个新的游标对象.

连接没有过关闭前,游标对象可以反复使用.

cursor参数,可以指定一个cursor类,如果为none,默认使用cursor类.

操作数据库

数据库操作需要使用cursor类的实例,提供execute()方法,执行SQL语句,成功返回影响的行数.

增删相同,注意要conn.commit() ,sql语句实现具体功能

import pymysql

### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)


sql = "insert into user (name, password) values (%s,  %s)"

cursor.execute(sql, ('dshadhsa', 'dbsjabdjsa'))  ### 新增一条数据

print(cursor.lastrowid)   ### 获取最后一行的ID值

# data = [
#     ('zekai1', 'qwe'),
#     ('zekai2', 'qwe1'),
#     ('zekai3', 'qwe2'),
#     ('zekai4', 'qwe3'),
# ]
# cursor.executemany(sql, data)  ### 新增多条数据

#### 加如下代码
conn.commit()

cursor.close()
conn.close()

增删相同,注意要conn.commit() ,sql语句实现具体功能

删除重建

import pymysql

conn = pymysql.connect(host= "localhost",user='root',password='******',database='homework2',chatset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'select * from teacher_info'
cursor.execute(sql)

cursor.close()
conn.close()

新增记录

使用insert into 语句插入数据.需要手动进行数据管理.

事务管理

connection类的三个方法:

begin开始事务

commit将变更事务提交

rollback回滚事务

一般流程

  • 建立连接
  • 获取游标
  • 执行SQL
  • 提交事务
  • 释放资源
查询

cursor类的获取查询结果集的方法有fetchone(),fetchmany(size,none),fetchall()

  • fetchone()方法,获取结果集的下一行

  • fetchmany(size=none)方法,size指定返回的行数的行,none返回空元组.

  • fetchall()方法,获取所有行

? 返回多行,如果走到末尾,就返回空元组,否则返回一个元组,其元素就是每一行的记录.

? 每一行的记录也封装在一个元组中.

cursor.rownumber放回当前行号.可以修改,支持负数.

cursor.rowcount返回总行数

注意:fetch操作的是结果集,结果集是保存在客户端的,也就是说fetch的时候,查询已经结束了.

带列名查询

cursor类的一个mixin的字类DictCursor.

使用cursor=conn.cursor(DictCursor)就可以了

返回一行,是一个字典

返回多行,放在列表中,元素是字典,代表行

SQL注入攻击

猜测后台数据库的查询语句使用拼接字符串的方式,从而经过设计为服务器传参,令其拼接处特殊字符串,返回用户想要的结果.

参数化查询,可以有效防止注入攻击,并提高查询的效率.

### 连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
# cursor = conn.cursor() ### 默认返回的值是元祖类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)

# sql = "select * from user where name='%s' and password='%s'" % (user, pwd)
sql = "select * from user where name=%s and password=%s"

cursor.execute(sql, (user, pwd))
res = cursor.fetchall()  ###取出所有的数据 返回的是列表套字典
print(res)

cursor.close()
conn.close()
上下文支持

查看连接类和游标类的源码

连接类进入上下文的时候会返回一个游标对象,退出时如果没有异常会提交更改.

游标类也使用上下文,在退出时关闭游标对象.

conn的with进入是返回一个新的cursor对象,退出时,只是提交或者回滚了事务,并没有关闭cursor和conn

不关闭cursor就可以接着用,省的反复创建.