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()

posted @ 2019-10-31 22:25  W文敏W  阅读(163)  评论(0编辑  收藏  举报