• Python操作数据库及hashlib模块


    一、hashlib模块
    hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
    import hashlib #导入模块
    ######## md5 ###########
    m = hashlib.md5() #创建一个对象
    m.update(b"hhf") #加密字符串 b代表byte,是把字符串转换成byte类型,也可以用bytes()强制转换
    #m.update(bytes("hhf",encoding='utf-8')) #不指定encoding会报错,TypeError: Unicode-objects must be encoded before hashing
    #bytes() 强制转换为字节类型
    print(m.digest()) #取加密后字符串 转换成2进制格式hash
    print(m.hexdigest()) #16进制格式hash,比较常用
     
    ###########-sha1 ########
    hash = hashlib.sha1()
    hash.update(b'admin')
    print(hash.hexdigest())
     
    # # ######## sha256 ########
    hash = hashlib.sha256()
    hash.update(b'admin')
    print(hash.hexdigest())
     
     
    # # ######## sha384 ########
    hash = hashlib.sha384()
    hash.update(b'admin')
    print(hash.hexdigest())
     
    # # ######## sha512 ########
    hash = hashlib.sha512()
    hash.update(b'admin')
    print(hash.hexdigest())
     
    #以上的加密方法都无法解密
    二、Python操作数据库
    python3中操作mysql数据需要安装一个第三方模块,pymysql,使用pip install pymysql安装即可,在python2中是MySQLdb模块,在python3中没有MySQLdb模块了,所以使用pymysql
     
    1.操作Mysql(oracle的和mysql的一样,只不过是库不一样而已)
    pip install pymysql #安装mysql模块
    
    import pymysql
    ip = '127.0.0.1'
    port = 3306
    passwd = 'root'
    user = 'root'
    db = 'szz'
    #建立数据库连接,指定数据库的ip地址,账号、密码、端口号、操作的数据库、字符集
    conn=pymysql.Connect(host=ip,port=port,user=user,passwd=passwd,db=db,charset='utf8')
    #conn=pymysql.Connect(host='127.0.0.1',port=3306,user='root',passwd='root',db='szz',charset='utf8')
     
    cur = conn.cursor() #在连接上建立一个游标
    #cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立 一个游标,指定游标类型为字典类型,操作返回的结果为字典类型,这个方便取值
     
    # 执行SQL,并返回收影响行数
    #effect_row = cursor.execute("update students set name = 'hhf' where id = 1;")
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.executemany("insert into students (name,age) values (%s,%s); ", [("hhf", 18), ("aaa", 20)])
    #sql = 'insert into nhy (id,name,sex) VALUE(80,"cc","女");'
    sql2 ='select * from nhy;'
    cur.execute(sql2)
     
    #查询语句可以用这个
    print(cur.fetchall()) #获取表中所有数据,返回结果为List,如果是普通游标,无素为元组,字典游标,元素为字典
    #print(cur.fetchone()) #获取一条,一次获取一条
    #如果先fetchall()再fetchone是没有结果的,因为游标已经移动到最后,用cur.scroll()来移动游标
    #cur.scroll(0,mode='absolute') #absolute 绝对位置 就是把游标直接移到哪里
    #cur.scroll(5,mode='relative') # reletive 相对位置 这个是相对于当前游标移动到哪里
    #print(cur.fetchmany(3)) #获取前n行数据
     
    conn.commit() #提交,insert,delete,update必须提交才能生效,
     
    #有连接就有关闭
    cur.close()#关闭游标
    conn.close()#关闭连接
     
    操作数据库的函数
    def OperationDb(host,user,passwd,db,sql,port=3306,charset='utf8'):
    conn = pymysql.connect(
    host=host,user=user,passwd=passwd,port=port,
    db=db,charset=charset
    ) #建立连接
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标
    cur.execute(sql)#执行sql
    #insert update delete语句需要commit()才能提交, #select 不需要
    #判断是什么语句
    if sql.startswith('select'):
    res = cur.fetchall()
    else:
    conn.commit()
    res = 88
    cur.close()
    conn.close()
    return res
     
    if __name__ == '__main__':
    ip = '127.0.0.1'
    port = 3306
    passwd = 'root'
    user = 'root'
    db = 'szz'
    sql = 'insert into hhf(id,name,sex) VALUE (8,"hhff","未知");' # 插入
    sql2 = 'select * from hhf limit 3;' # 查询
    sql3 = 'delete from hhf where id=8' # 删除
    sql4 = 'update hhf set name = "hhf" where id=8' # 更新
    s = OperationDb(host=ip, port=port, user=user, passwd=passwd, db=db, sql=sql2)
    #也可以直接传值,
    # s = OperationDb(host='127.0.0.1', user='root', passwd='root', db='szz', sql=sql2)
    print(s)
     
    2.操作redis
    redis是一个nosql类型的数据库,数据都存在内存中,有很快的读写速度,python操作redis使用redis模块,pip安装即可
     
    pip install redis #安装redis模块
     
    import redis,json
    ip = '127.0.0.1'
    port=6379
    db=0
    passwd = ''
    #连接redis
    r = redis.Redis(host=ip,port=port,db=db,password=passwd)
     
    r.set('age',18) #set值 redis里面存的数据全是字符串
    r.set('name',[1,2,3,4]) #可以传字典和list 最后会被转成字符串 ,redis连接工具,reload查看更新的redis数据
    r.set('name',{1,2,3,4}) #redis里面存的数据都是字符串,如果set的key已存在,就会更新值
    r.setnx('ccc','hhf') #set值,如果key不存在会创建,key存在,不操作
    r.setex('bbb','hahaha',15) # 可以设置key的失效时间,token的失效时间用的就是这个
     
    name = r.get('name')#从redis中获取的数据全是bytes类型
    print(name) #结果b'{1, 2, 3, 4}'
    name = name.decode()#要使用decode方法给它转成字符串才能继续操作
    print(r.get('aaaa'))#get不存在的key,就返回None
     
     
    r.mset(hhf1='haha',hhf2=1888) #批量设置值
    r.mget('name','age') #批量获取key
     
    r.delete('age') #删除某个key
    r.delete('hhf1','hhf2')#删除多个key
     
    print(r.keys()) #获取所有的key,返回的结果是List,如果需要使用,得遍历后decode()
    print(r.keys('*n*')) #获取含有n的key
     
    # #下面操作哈希类型的key
    r.hset('hhf_session','name','hhf')
    r.hset('hhf_session','age',18)
     
    print(r.hget('hhf_session','age'))#获取hhf_session里面age的值,必须两个参数
    print(r.hgetall('hhf_session'))#获取哈希类型里面所有的值
     
    r.delete('hhf_session') #把key删除,包括下面的nam和age
    r.hdel('hhf_session') #会报错,该方法里面的两个参数是必填的
    r.hdel('hhf_session','name')#删除hhf_session下的name属性
    r.hsetnx('hname','key2','value23')#给name为hname设置key和value,和上面的不同的是key不存在的时候#才会set
    r.hmset('hname',{'k1':'v1','k2':'v2'})#批量设置哈希类型的key和value
     
    #如果key里面有冒号 就会多个文件夹
    r.set('hhf:hhf','haha')
    r.set('hhf:cccc','aaa')
    r.hset('sss:hhf','hhf','123456')
    r.delete("hhf:cccc")
     
    操作redis的函数:
    def OpRedis(host,passwd,k,v=False,port=6379,db=0):
    #此函数只实现了redis的set与get方法 只是针对str类型
    #del方法及hset hget方法未实现
    r = redis.Redis(host=host,password=passwd,port=port,db=db)
    #连接数据库
    if v:#判断value是否传值,如果传了就说明是set方法
    r.set(k,v)
    res = 88
    else:
    res= r.get(k).decode()
    #因为从redis里面获取到的数据都是字节类型的 ,要把它转成字符串
    #所以要用decode方法
    return res
     
  • 相关阅读:
    数组元素按指定的位置排序
    git修改历史提交的备注信息
    js常用遍历理解
    async await和promise的区别,和使用方法
    js检测邮箱格式,正则检测邮箱格式
    前端,es6中的promise异步方法,及用的场景
    JMter 压力测试工具简单使用及介绍
    Vue Config
    vue 文件上传
    Windows Redis集群搭建简单版
  • 原文地址:https://www.cnblogs.com/hhfzj/p/7103113.html
Copyright © 2020-2023  润新知