zoukankan      html  css  js  c++  java
  • Python学习笔记十三_操作数据库

    一、数据库类型

    写代码的时候经常会操作数据库,增删改查。数据库有很多类型,关系型数据库(mysql、oracle、sql server、db2、sqlite)和非关系型数据库(mongodb、redis)

    1、关系型数据库

      (1) 通过sql查找数据表

      (2) 数据存在磁盘中,掉电数据不会丢失

    2、非关系型数据库

      (1) 没有表和sql,通过get(‘k’),set(‘k’)插入或读取数据

      (2) 数据全部存在内存里,掉电数据会丢失

      (3) redis本身性能是非常好的,每秒支持30w次的读写

    二、操作Mysql

    1、Python3安装pymysql第三方模块

       Python2中是MySQLdb模块。

       Python3总没有MySQLdb模块了,所以使用pymysql

    2、操作Mysql数据库

      (1) 创建连接,指定数据库的ip地址,账号、密码、端口号、要操作的数据库、字符集

      (2) 创建游标

      (3) 执行sql

      (4) 获取结果

      (5) 关闭游标

      (6) 连接关闭

    import pymysql
    # 1、创建连接,指定数据库的ip地址,账号、密码、端口号、要操作的数据库、字符集
    conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123456',
                           port=3306, db='data', charset='utf8')
    # port必须写int类型,charset必须写utf8,不能是utf-8
    cur = conn.cursor()#2、创建游标
    #执行sql,并返回受影响的行数,1
    effect_row = cur.execute('update stu set username = "Rebecca" where userID = 1;')
    print(effect_row)
    #执行sql,并返回受影响的行数,2
    values = [(7,"Sara","123"),(8,"Kimi","123")]
    effect_rows = cur.executemany('insert into stu (userID,username,passwd) VALUES (%s,%s,%s);',values),
    print(effect_rows)
    #sql本身是字符串,使用占位符来替换变量
    username = 'Amy'
    sql = 'select * from stu where username = "%s";'%username
    cur.execute(sql)#3、执行sql
    conn.commit()#提交,不然无法保存新建或修改的数据。除了select其他sql都需要commit
    res =cur.fetchall()#4 、获取结果,返回的是元组
    print(res)
    cur.close()# 5、关闭游标
    conn.close()#6、连接关闭

    3、指定游标类型返回结果为字典 

    cursor = conn.cursor()默认的游标类型,获取到的返回结果都是元组

    ((5, 'Ben', '123'), (6, 'Lily', '123'))

    如果想获取到的结果是一个字典的话,需要指定游标类型

    [{'username': 'Ben', 'passwd': '123', 'userID': 5}, {'username': 'Lily', 'passwd': '123', 'userID': 6}]

    def my_db(sql):
        import pymysql
        conn = pymysql.connect(host = '127.0.0.1',user = 'root', passwd = '123456',
                               port = 3306,db='data',charset = 'utf8')
        cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,指定游标类型返回的是字典
        cur.execute(sql)
        conn.commit()
        res = cur.fetchall()
        cur.close()
        conn.close()
        return res
    print(my_db('select * from stu'))

    4、fetchall()与fetchone()

    如果sql语句执行的结果是多条数据的时候,那就用 fetchall()
    如果你能确定sql执行的结果只有一条,那就用fetchone()

    def my_db(sql):
        import pymysql
        conn = pymysql.connect(host = '127.0.0.1',user = 'root', passwd = '123456',
                               port = 3306,db='data',charset = 'utf8')
        cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,指定游标类型返回的是字典
        cur.execute(sql)
        conn.commit()
        res = cur.fetchall()
        #获取到这个sql执行的全部结果,它把数据库表里面的每一行数据放到一个list里面,[]
        #[{'username': 'Ben', 'passwd': '123', 'userID': 5}, {'username': 'Lily', 'passwd': '123', 'userID': 6}]
        res = cur.fetchone()
        # 获取到这个sql执行的一条结果,它返回的就只是一条数据,{}
        #{'username': 'Ben', 'passwd': '123', 'userID': 5}
        res =cur.fetchmany(3)
        # 能传入一个数,返回多少条数据,返回的结果放入list,[]
        cur.close()
        conn.close()
        return res
    print(my_db('select * from stu'))

    5、获取表头与列自增

     cur.description查看表结构,列表生成式获取表头

    def my_db(sql):
        import pymysql
        conn = pymysql.connect(host = '127.0.0.1',user = 'root', passwd = '123456',
                               port = 3306,db='data',charset = 'utf8')
        cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,指定游标类型返回的是字典
        cur.execute(sql)
        # fileds = []
        # for filed in cur.description:
        #     fileds.append(filed[0])
        # cur.description查看表结构
        # 返回[(('userID', 3, None, 11, 11, 0, True), ('username', 253, None, 30, 30, 0, True), ('passwd', 253, None, 40, 40, 0, True))]
        fileds = [filed[0] for filed in cur.description]#列表生成式
        cur.close()
        conn.close()
        return fileds #['userID', 'username', 'passwd']
    print(my_db('select * from stu'))

    enumerate打印列表下标及元素,循环列表,下标自增实现列自增

    fileds = ['id','name','sex']
    for index,filed in enumerate(fileds):#enumerate打印列表下标及元素
        print(index,filed)

    小练习:通用导出excel

    三、操作redis

    redis是一个nosql类型的数据库,数据存在内存中,有很快的读写速度。

    1、安装redis第三方模块

    2、操作redis数据库

    import redis
    r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=8,port=6379)
    #指定连接redis的端口和ip以及哪个数据库,redis默认端口6379
    #=====================下面操作都是针对 string类型========================
    r.set('name','hello')#
    r.set('name','python')#修改,也是set
    r.setnx('name','hello')#设置的name的值,如果name不存在的时候才会设置,存在不会修改原值
    r.setex('name','hello',300)#设置的name的值和失效时间,过了时间key就会自动失效,最后这个参数是秒
    r.mset(k1='v1',k2='v2')#批量设置值
    r.set('name:java','hi')#新建文件夹、新建k-v
    print(r.get('name'))#查,get返回的值是bytes类型,b'hello'
    print(r.get('name').decode())#bytes类型decode后转换为str,hello
    print(r.mget('k1','k2'))#批量获取key对应的value,放入list[]
    print(r.keys())#获取所有的key,放入list[]
    print(r.keys('*me'))#模糊匹配,a*以a开头,*a*包含a,*a以a结尾
    print(r.get('dr'))#找不到返回None,不报错
    print(r.get('name:java').decode())#获取文件夹下key的值
    r.delete('name')#
    for k in r.keys():#删除所有的key
        r.delete(k)
    
    #====================下面都是针对hash类型:嵌套字典=========================
    # {
    #     {'Amy':'123'},
    #     {'Ben':'123'}
    # }
    r.hset('goods','ball','red')#增,k:goods,v:(k:ball,v:red)
    r.hsetnx('goods','ball','black')#设置key和value,key不存在的时候才会设置,存在不会修改原值
    r.hmset('goods',{'phone':'99.99','car':'20'})#批量设置哈希类型的key和value
    r.hset('goods','pen','blue')#修改,也是hset
    print(r.type('goods'))#查看key是什么类型,b'hash'
    #不能写成print(type(r.'goods'))
    print(r.type('dongrui:python'))#b'string'
    r.expire('goods',300)#第一个key设置失效时间,设置存在的key,不存在不报错
    print(r.ttl('goods'))#获取失效时间
    print(r.hget('goods','ball'))#查,指定大key和小key获取对应的数据
    print(r.hgetall('goods'))#获取大key里面所有的key和value,获取结果是字典,字典中的k-v都是bytes类型
    goods = {}
    for k,v in r.hgetall('goods').items():#将字典中的b'k',b'v'转化为正常的内容
        goods[k.decode()] = v.decode()
    print(goods)
    print(r.keys())#获取所有的大key,放入list[]
    r.hdel('goods','pen')#删除指定的key
    r.delete('goods')#删除整个key
    
    # ======================字符串与二进制相互转化=====================
    s = '123'
    s.encode()#把字符串转成二进制
    b = b'abc'
    b.decode()#把bytes类型转成字符串
    r.exists(k)#判断这个key是否存在
    r.flushdb() #清空redis,不用获取所有值再挨个删除

    小练习:将mysql的数据读出存入redis

    需求:

    1、连接数据库,查到数据库里面所有的数据,游标类型要用pymysql.cursors.DictCursor

    2、查到所有的数据{"id":1,"passwd":"123","username":"Amy","is_admin":1}

    3、循环这个list,取到username,把username当做key

    4、再把小字典转成json,存成hash的value

    实现:

    import pymysql,redis,json
    
    def my_db(sql):
        conn = pymysql.connect(host = '127.0.0.1',user = 'root', passwd = '123456',
                               port = 3306,db='data',charset = 'utf8')
        cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#指定游标类型返回的是字典
        cur.execute(sql)
        res = cur.fetchall()
        cur.close()
        conn.close()
        return res
    
    all_user = my_db('select * from my_user') #list[{},{}]
    r = redis.Redis(host = '127.0.0.1',password = '123456',db=1)
    for user in all_user:
        k = user['username']
        r.hset('stu_info',k,json.dumps(user))
  • 相关阅读:
    解析XML文件时做得修改
    NSOprationQueue 与 GCD 的区别与选用
    UIPickerView(选择器)
    iOS NSDatePicker
    Http协议三次握手过程
    iOS之KVO和KVC
    iOS中使用RSA对数据进行加密解密
    Demo1_iOS9网络适配_改用更安全的HTTPS
    layer 的常用属性
    IOS OC声明变量在@interface括号中与使用@property的区别
  • 原文地址:https://www.cnblogs.com/dongrui624/p/8950540.html
Copyright © 2011-2022 走看看