数据库开发
驱动
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就可以接着用,省的反复创建.