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 ...
随机推荐
- PHP中截取中文乱码
大家都知道,一个汉字在gb2312下面是占2个字节,用传统的substr肯定会出问题 ,所以应该用,mb_substr和mb_strcut两个函数 在这个之前,打开php.ini打开php_mbstr ...
- [r]Setting up Django and your web server with uWSGI and nginx
Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...
- oracle常见为题汇总,以及一个简单数据连接操作工厂
本人软件环境:win8.1 64位操作系统,vs2013,安装好了与oracle数据库对应的客户端 连接oracle数据库.以及操作数据库 1.使用IIS建立网站,浏览网页时候,提示“ ...
- Intrusion Detection of Specific Area Based on Video
- outline属性
outline(轮廓)用于设置元素周围的一条线,用于元素边框的外围,可起到突出元素的作用. outline属性所有浏览器都支持,如果规定了 !DOCTYPE,则 IE8 支持 outline 属性. ...
- Unity NGUI 3.0.4版本 制作网络版斗地主
Unity NGUI 3.0.4版本 @by 灰太龙 开发环境 Win7旗舰版 Unity 4.2.1f4 本文就写个开门篇,告诉大家怎么用NGUI,第一步导入NGUI 3.0.4版本! 1.启动U ...
- Cow Exhibition
poj2184:http://poj.org/problem?id=2184 题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值.但是要保证总的s> ...
- h.264直接预测
直接预测是B帧上一种独有的预测方式,其中直接预测又分为两种模式: 时域直接模式(temporal direct).空域直接模式(spatial direct). 在分析这两种模式之前,有一个前提概念需 ...
- Android 判断wifi和4G网络是否开启
public boolean isWifiAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) g ...
- Lua I/0输入输出
I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用显式的文件句柄,并将所有的操作定义为文件句柄上 ...