day36_python操作数据库模块pymysql
1、python控制数据库
1、导入第三方库import pymysql
2、建立连接:conn = pymysql.connect(host='localhost',user='root',password='',database='test',charset='utf8')
3、建立游标:cursor = conn.cursor()
4、执行sql语句:cursor.execute(sql)
5、查看结果:res = cursor.fetchall()
6、关闭游标cursor.close()
7、关闭连接conn.close()
注意:
1、建立连接时,参数必须全部填写正确,否则报错,charset可以不写,默认为''
2、建立游标时,cursor()
不传参则默认查询结果以元组存储,参数为cursor=pymysql.cursors.DictCursor
时,查询结果以字典存储
2、执行sql语句,返回的是sql的记录数,是个整数
3、查看结果除了查看所有结果用fetchall()
,还有查看一个fetchone()
查看多个fetchmany()
l
2、sql注入问题
问题描述:
执行带参数的sql
时,由于sql
是拼接字符串而来,那么参数拼接时,如果参数中带有特殊字符,拼接之后,可能会破坏sql
的语法,如:
1、带有#
字符,拼接后,#
后的字符将被注释,不会被执行
2、带有引号,拼接后,引号可能会破坏参数完整性
等等
示例:
sql = f'select * from user where username="{username}" and password="{password}"'
当username='hwm "#',password='1234'拼接后的sql为
sql = f'select * from user where username="hwm"#" and password="1234"'
解决方法:
拼接sql
时,设置参数占位符,但是不传参
执行sql
时,再传参
需要注意的是,此时拼接sql
只能使用占位符%s
实例:
# %s占位符
# 此时%s不能再加引号,因为execute语句会做处理
sql = 'select * from user where username=%s and password=%s'
cursor.execute(sql,(username,password))
3、增删改查
3.1 增加数据
1、sql语法:sql = 'insert into user (username,password) values (%s,%s)'
2、执行sql:
增加一条数据:cursor.exectute(sql,('nick','123'))
增加多条数据:cursor.executemany(sql,data)
,data
为列表,列表元素为存储每一条数据记录的元组(username,password)
3、向数据库提交数据:conn.commit()
,这一步必须有,否则无法保存到数据库
实例:插入300万条数据
import pymysql
conn = pymysql.connect(host='localhost',database='test',user='root',password='',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into user (username,password) values (%s,%s)'
data =[]
for i in range(3000000):
userinfo = {'username':'nick'+str(i),password='123'+str(1)}
data.append(userinfo)
cursor.executemany(sql,data)
conn.commit()
cursor.close()
conn.close()
3.2 删除数据
1、sql语法:sql = 'delete from user where id=%s'
2、执行sql:cursor.execute(sql,(1,))
,只有一个参数时,也得用元组传参
3、向数据库提交数据:conn.commit()
3.3 修改数据
1、sql语法:sql = 'update user set name=%s where id=%s'
2、执行sql:cursor.execute(sql,('nick_nb',3))
3、向数据库提交数据:conn.commit()
3.4 查询数据
1、sql语法:sql = select * from user
2、执行sql:cursor.execute(sql)
3、获取数据:res = cursor.fetchall()
4、打印数据:print(res)
注意:
1、获取数据,得到的结果跟获取游标对象时的参数有关,默认为元组,可以通过参数设置为字典:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
2、在对数据操作之后,得到的游标对象cursor
存储了操作结果的内容,可以通过对象.属性的方式查看,如:
最后一行的id:cursor.lastrowid
4、游标对象的属性
存储的是执行sql语句之后的结果
4.1 数据属性
最后一行的id:cursor.lastrowid
查询结果的描述:cursor.description
数据行数:cursor.rowcount
等等
4.2 方法
获取数据,以列表存储,列表元素为一条条的记录,列表元素的数据类型和实例化游标对象时的参数有关
取出所有的数据:cursor.fetchall()
制定获取多少条数据:cursor.fetchmany(num)
取出一条数据:cursor.fetchone()