zoukankan      html  css  js  c++  java
  • [Python] 使用map函数把数据库表头跟字段内容生成字典形式

    重点:

    cursor这里有个属性:description。获取的是数据库每个栏位(字段,列)情况: (('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False)

    # 将一条数据转成字典方便查找
    new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
    # 将多条数据转成字典方便查找,map函数可以把列表中所有元素一个个地传递给一个函数,实现多条循环取
    def new2dict(new):
      return dict(zip([x[0] for x in cursor.description],[x for x in new]))
    news_list = list(map(new2dict,cursor.fetchall()))
     
    连接数据库
      import pymysql
      # 连接数据库
      db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')
      以上的参数是必填的
      · host: 这个是ip地址,因为我这里是本地的,所以填127.0.0.1,也可以填localhost。
      · user:用户名,如果你也是本地的,就填root好了
      · passwd:这个是密码,填上你自己设的密码就可以了
      · db:这个是数据库名,我这里选的是news数据库
      · port:这个是端口,本地的一般都是3306
      · charset:这个是编码方式,要和你数据库的编码方式一致,要不会连接失败
     连接上了,怎么验证呢?这里我们可以选择查一条数据
    try:
        db = pymysql.connect(host='127.0.0.1',user='root',passwd='your         password',db='news',port=3306,charset='utf8')
        # 检验数据库是否连接成功
        cursor = db.cursor()
        # 这个是执行sql语句,返回的是影响的条数
        data = cursor.execute('SELECT * FROM `new`')
        # 得到一条数据
        one = cursor.fetchone()
        print(data)
        print(one)
    except pymysql.Error as e:
        print(e)
        print('操作数据库失败')
    finally:
        # 如果连接成功就要关闭数据库
        if db:
        db.close()
    代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 pymsql.Error 里面。上面的代码看不懂也没关系,因为我接下来会说,如果运行后有结果证明连接成功。
      在用完后,一定要记得关闭数据库连接,防止资源泄露问题。
    对数据进行查询
    import pymysql
    try:
        conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)
        # 这个是光标,用来操作数据库语句
        cursor = conn.cursor()
        # 执行sql语句
        cursor.execute('SELECT * FROM `new`')
        print(cursor.fetchone())
        # 关闭光标
        cursor.close()
    except pymysql.Error as e:
        print(e)
        print('操作数据库失败')
    finally:
        if conn:
        conn.close()
    代码解读:
      · cursor():这个是光标,用来执行mysql语句的,用完后也是需要关闭的
      · excute():这个是执行语句,执行参数的mysql语句
      · fetchone():这个是查看执行语句后的一条数据
      · fetchall():这个是查看所有数据
    在查询数据后,返回的是一整条数据,有没有可以按字典形式来查询的呢?来试试!
    print(cursor.fetchone()['name'])
    
    Traceback (most recent call last):
    File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in <module>
    
    print(cursor.fetchone()['name'])
    
    TypeError: tuple indices must be integers or slices, not str
    查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。
      虽然python没有提供,但是我们可以手动转成字典来查询啊
    cursor这里有个属性:description。获取的是数据库每个栏位(字段,列)情况,如下:
    print(cursor.description)
    
    # 下面是结果
    (('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False)

    所以,我们利用这个属性手动生成字典:

    # 将一条数据转成字典方便查找
    new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
    print(new)
    
    # 下面是结果
    {'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}
    
    这里利用zip函数和列表生成式来一行代码就生成成功了
    用字典来查询,现在就可以了
    
    print(new['title'])
    # 下面是结果
    考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福

    但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到map函数了

    def new2dict(new):
      return dict(zip([x[0] for x in cursor.description],[x for x in new]))
    news_list = list(map(new2dict,cursor.fetchall()))
    print(news_list)
    
    # 下面是结果
    [{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}, 
    {'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背锅 连遭浓眉大帽太尴尬', 'content': '火箭在客场以113-115惜败于鹈鹕,4连胜终结。詹姆斯-哈登出战34分钟16投5中,其中三分球9投只有1中,罚球14罚12中,拿到23分、11助攻、5篮板但也有4次失误,其在场正负值为尴尬的-12分', 'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author': 'youngcao', 'from': '腾讯体育','is_valibale': 1}]

    这里很巧妙的利用了map函数,因为多条数据就可以进行迭代了,需要操作每条数据,这样就可以想到map函数。

  • 相关阅读:
    angularJS获取json数据(实战)
    HTML中使背景图片自适应浏览器大小
    实现table的单线边框的办法
    [转载]姑娘,你为什么要编程呢?
    可拖拽和带预览图的jQuery文件上传插件ssiuploader
    table布局的简单网页
    3D立体照片墙
    五一假期安排
    有点小迷惘
    一直都不明白,现在还是木有明白,那些人,那些事——残念
  • 原文地址:https://www.cnblogs.com/wynlfd/p/10986107.html
Copyright © 2011-2022 走看看