Python访问sqlite3数据库取得dictionary的正路!
【引子】
很多人都知道,Python里是内置了很好用的sqlite3的。但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple。以前吧,做自己的小项目,tuple就tuple,大不了dump成JsonArray,用的时候就values[index],为了省事,凑合着用。但这次工作需要,咱得返回一个JsonObject,得是字典形式的。
土方法:自己用循环解析tuple,手动转换成dict,但这方法也太傻了点对吧,还很麻烦,你得自己记住table里的column键,与tuple里的值拼接。对于SELECT * FROM table还好点,对于
SELECT column0, column1, ..., FROM table
简直烦死。
一个稍微Py点的写法是这样的:
values = [{'id' : row[0], 'name' : row[1]} for row in con.fetchall()]不错,看起来高大上多了,有python范。但要只是仅此而已的话,me是不屑专门写篇博文来记录滴!
【正文】
首先呢,我们知道,python访问MySql时有个不错的方法:
cursor=db.cursor(MySQLdb.cursors.DictCursor)
(不知道?那算你看此文的额外收获)。那么类似的,sqlite3里有没有这样的实现呢?很遗憾,目前我没发现,不然也轮不到我这篇博文来讨论这个问题了。但,没有这样的实现,不代表不能实现!查Api,官方其实是预留了实现方案的!connect其实有一个属性,con.row_factory!看到名字估计很多人瞬间就有想法了对吧?没错,甚至Api里都已经写好了一个实现的函数:
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
只要简单的把这个函数传递给con.row_factory就ok了,以后从这个con取出的值就会通过这个函数,变成key:value形式,key就是创建table时指定的column名字,你再也不用另行记录它们,因为它们本就是存在的,cursor.description本就包含这个信息,只是默认没有被添加到结果里罢了!
呃,上面那个是官方Api里面给出的,其实还有更加Pythonic的写法:
def dict_factory(cursor, row):
return dict((col[0], row[idx]) for idx, col in enumerate(cursor.description))
Python访问sqlite3数据库取得dictionary的正路!的更多相关文章
- 自己整理的一个访问SQLite3数据库的C++类
原文地址:自己整理的一个访问SQLite3数据库的C++类作者:vigra 近日,对SQLite3的使用进行了研究.真不愧是优秀的嵌入数据库,API接口也极其简捷.基本上只要使用以下几个接口就能完成数 ...
- 《Python操作SQLite3数据库》快速上手教程
为什么使用SQLite数据库? 对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用需要全功能的关系型数据库.SQLite的目标则是介于两者之间的中小系统.它有以 ...
- Python访问MySQL数据库并实现其增删改查功能
概述:对于访问MySQL数据库的操作,我想大家也都有一些了解.不过,因为最近在学习Python,以下就用Python来实现它.其中包括创建数据库和数据表.插入记录.删除记录.修改记录数据.查询数据.删 ...
- 利用Python访问Mysql数据库
首先要明确一点,我们在Python中需要通过第三方库才能访问Mysql. 有这样几种方式:Mysql-python(即MySQLdb).pymysql.mysql-connector.Mysql-py ...
- Python处理Sqlite3数据库
sqlite3比较小众 本章主要通过Python Code表述如何增.查.改.删 sqlite3 DB 一.直接上代码 #!/usr/bin/env python # -*- coding: utf- ...
- python访问Oracle数据库相关操作
环境: Python版本:3.6.6 win系统:64位 Linux系统:64位 首先安装配置时,版本必须一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本! ...
- python 读取sqlite3 数据库
import sqlite3 name = "tom" age = 30 con = sqlite3.connect("d:\\test.db") cur = ...
- Python访问MongoDB数据库
#encoding: utf-8 __author__ = 'Administrator' #import pymongo from pymongo import MongoClient,GEO2D ...
- 【转】Python访问oracle数据库,DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found"
使用python连接Oracle,出现如下错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified ...
随机推荐
- 支付宝支付错误 系统忙:错误代码AE150002999
今天出现支付宝支付错误,支付系统繁忙请稍等,错误码AE150002999.测试了其他连个收款方,可跳转到正常扫码支付页面,排除了代码错误. 在登录支付宝商家中,也签约了“即时到帐”功能.度娘和查看都找 ...
- php中判断变量是否为空
从数据库中取出值后判断是否为空,这个看起来很简单,只要和null比较一下就可以了,其实不然, if($obj==null){ } 这样写会报错的:Notice: Trying to get prope ...
- openerp 产品图片的批量写入
Write a short python script which loops over the image files, encode with base64 and write to OpenER ...
- java学习之 垃圾回收
垃圾回收器始终以一个较低优先级的后台进程进行垃圾的回收工作,这样不会影响程序的正常工作. 通常只有当内存到达用尽的边缘而程序需要分配新的内存空间时,垃圾回收器才会执行. 垃圾回收的条件:1,垃圾回收器 ...
- arm-none-eabi-gcc install
Zephyr除了官方的编译工具,还有第三方工具 arm-none-eabi-gcc . This PPA is an alternative to toolchain released at http ...
- C# IOCP服务器
C# IOCP服务器 @by 群63438968 这是我写的unity 网络斗地主的服务器源码,本来我想只公开部份服务端代码的,但是为了回报大家的热情,以及曾经和现在的好兄弟,我计划慢慢开源! 告诉 ...
- ORACLE WIN7安装过程截图
尽管 有点不正规,但还可以.
- ibatis报错
关键词:org.springframework.dao.DataIntegrityViolationException 在程序中进行数据库插入操作时报错如下: 未知异常:org.springframe ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
- 【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间
原文网址:http://bbs.eeworld.com.cn/thread-438571-1-1.html /* * 通过使用if(gatt==null ...