06pymysql

【一】pymysql
1.我们可以利用pymysql在python中操作数据库
原理是pyMySQL-->是封装好的执行subprocess链接数据库执行数据库命令的模块
官网:https://zetcode.com/python/pymysql/
【二】使用示例
import pymysql
from pymysql.cursors import DictCursor
​
# 1.链接服务端
conn=pymysql.connect(
    host='127.0.0.1',#mysql服务端地址
    port=3306,#mysql默认port端口号
    user='root',#统一写root
    passwd='llh011223',#密码
    database='school',#数据库
    charset='utf8'#字符编码,千万不要多加杠,会报错
)
#2.产生获取命令的游标对象
cursor = conn.cursor(DictCursor)#括号内不加参数,则是元组 不够精确 添加参数变成字典
# 3.编写sql语句
sql='select * from student;'
# 4.执行sql语句
cursor.execute(sql)
# 5.获取结果
res=cursor.fetchall()
print(res)
【三】大部分参数介绍
user=用户名---》写root就行
password=密码,
host=IP 本地 127.0.0.1 / localhost,
database= 需要连接到哪个数据库,
port=端口,--》mysql3306
charset=编码集,utf8
# sql_mode=严格模式,
cursorclass=Cursor 获取查询集的显示结果样式,--->写DictCursor,结果默认字典了
connect_timeout=10,
autocommit=False 自动执行提交,
passwd=输入密码,  password---》缩写
db=需要连接到哪个数据库---》database缩写
【四】获取结果各种方法
(1)cursor.fetchall()-->获取全部结果
没有指定显示结果样式的时候的结果是元组
((1, 'Jack', '100'), (2, 'Lucy', '100'), (3, 'Lily', '100'))
指定了DictCursor-->列表套字典
[{'sno': 1, 'sname': 'Jack', 'classno': '100'}, {'sno': 2, 'sname': 'Lucy', 'classno': '100'}]
(2)cursor.fetchone()-->获取一条结果
    就是一个字典--》一条信息数据
(3)cursor.fetchmany(size=指定条数)--》获取指定数量的结果 
(4)scroll--》
    cursor.scroll(1, 'relative')  # 相对于当前位置往后移动一个单位
    cursor.scroll(1, 'absolute')  # 相对于起始位置往后移动一个单位 
【五】原生操作的使用增删改查
(1)插
【1】方式一:直接写原生的SQL语句
sql = 'insert into user(username,password) values("dream","123456")'
指定 SQL 语句
cursor.execute(sql)
​
【2】方式二:格式化传入参数
%s 位置站位--->最常使用
 sql = 'insert into user(username,password) VALUES(%s, %s)'
execute 执行SQL语句传入数据的时候按照位置进行传入数据
cursor.execute(sql, ['opp', '123456'])
cursor.execute(sql, ('opp', '123456'))
​
【3】方式三:关键字传入参数
sql = 'insert into user(username,password) VALUES(%(name)s, %(pwd)s)'
cursor.execute(sql, {'name': "ppp", 'pwd': "123456"})
【4】批量插入数据
(1)方案一:遍历每一个数据然后插入数据
'''
name_list = [i for i in 'dream']
password_list = [str(i) for i in range(5)]
data_all = list(zip(name_list, password_list))
#[('d', '0'), ('r', '1'), ('e', '2'), ('a', '3'), ('m', '4')]
sql = 'insert into user(username,password) VALUES(%s, %s)'
for data in data_all:
    cursor.execute(sql, data)
'''
# (2)方案2 : 一次性批量插入数据
name_list = [i for i in 'dream']
password_list = [str(i) for i in range(5)]
data_all = list(zip(name_list, password_list))
sql = 'insert into user(username,password) VALUES(%s, %s)'
cursor.executemany(sql, data_all)
# 生效就需要提交事务
conn.commit()
​
# (3)方案3 : 一次性批量插入数据
        sql = 'insert into userinfo(name,password) values(%s,%s)'
        cursor.executemany(sql,[('tom',123),('lavin',321),('pony',333)])
(2)删
【1】直接写SQL语句
 sql = 'delete from user where id =2;'
cursor.execute(sql)
【2】站位
sql = 'delete from user where id =%s;'
cursor.execute(sql,[3])
​
【3】关键字站位
sql = 'delete from user where id =%(id)s;'
cursor.execute(sql, {'id': 4})
(3)改
【1】直接写
sql = 'update user set password="666" where id=5'
cursor.execute(sql)
【2】站位
sql = 'update user set password=%s where id=%s'
cursor.execute(sql,['999',5])
【3】关键字站位
sql = 'update user set password=%(new_password)s where id=%(id)s'
cursor.execute(sql, {'new_password': '<PASSWORD>', 'id': 5})
(4)查
【1】直接写
sql='select * from user where name="llh";'
【2】站位
sql='select * from user where name=%s;'
cursor.execute(sql,('llh'))
【3】关键字站位
sql='select * from user where name=%(name)s;'
cursor.execute(sql,{'name':'llh'})
【六】SQL注入问题
【一】问题 : 不用正确的密码即可登录成功
# 用户名和密码都不需要也可以登录
(1)输入带注释
SELECT * FROM users WHERE username = '' OR '1'='1' -- ' AND password = '$password';
因为在SQL中注释语法都是 注释标志 -- + 一个或多个空格
(2)将筛选条件变为 1
	
【二】SQL注入的解决办法
    # 使用官方提供并建议的传值方式进行传值
    # %s
    # %(name)s
  

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值