sqlalchemy 转json 的几种常用方式
sqlalchemy 转json 的几种常用方式
# -*- coding:utf-8 -*-
import datetime
from flask import Flask, json, jsonify
from sqlalchemy.orm import Query
from sqlalchemy.ext.declarative import DeclarativeMeta
from flask_sqlalchemy import SQLAlchemy, Pagination
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/camel?charset=utf8'
app.config['SQLALCHEMY_ECHO'] = False
# 方式三
class APIEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime('%Y-%m-%d')
elif isinstance(obj, datetime.time):
return obj.isoformat()
elif isinstance(obj.__class__, DeclarativeMeta):
return self.default({i.name: getattr(obj, i.name) for i in obj.__table__.columns})
elif isinstance(obj, dict):
for k in obj:
try:
if isinstance(obj[k], (datetime.datetime, datetime.date, DeclarativeMeta)):
obj[k] = self.default(obj[k])
else:
obj[k] = obj[k]
except TypeError:
obj[k] = None
return obj
# elif isinstance(obj, Pagination):
# return self.default(obj.items)
return json.JSONEncoder.default(self, obj)
app.json_encoder = APIEncoder # 直接修改json对时间格式/SQLAlchemy查询结果的解析方式
db = SQLAlchemy(app)
class ModelMixin(object):
__slots__ = ()
def __init__(self, **kwargs):
pass
def save(self):
db.session.add(self)
self.my_commit()
return self
def delete(self, commit=True):
db.session.delete(self)
if commit:
self.my_commit()
def add(self):
db.session.add(self)
def update(self, **kwargs):
required_commit = False
for k, v in kwargs.items():
if hasattr(self, k) and getattr(self, k) != v:
required_commit = True
setattr(self, k, v)
if required_commit:
self.my_commit()
return required_commit
def my_commit(self):
try:
db.session.commit()
except Exception:
db.session.rollback()
raise
@classmethod
def upsert(self, where, **kwargs):
record = self.query.filter_by(**where).first()
if record:
record.update(**kwargs)
else:
record = self(**kwargs).save()
return record
# 方式二
def to_json(self):
if hasattr(self, '__table__'):
return {i.name: getattr(self, i.name) for i in self.__table__.columns}
raise AssertionError('<%r> does not have attribute for __table__' % self)
class User(db.Model, ModelMixin):
__tablename__ = 'User'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), index=True, unique=True)
fullname = db.Column(db.String(32))
photo_url = db.Column(db.TEXT)
fk_location_code = db.Column(db.String(10))
fk_dept_id = db.Column(db.String(10))
source = db.Column(db.Integer)
create_time = db.Column(db.TIMESTAMP, default=datetime.datetime.now())
update_time = db.Column(db.TIMESTAMP)
# 方式一
def to_dict(self):
dict = {}
dict.update(self.__dict__)
if "_sa_instance_state" in dict:
del dict['_sa_instance_state']
return dict
@app.route('/1')
def first():
data = User.query.first()
print(isinstance(data.__class__, DeclarativeMeta)) # True
print(isinstance(data, DeclarativeMeta)) # False
print(isinstance(data.__class__, Query)) # False
print(isinstance(data, Query)) # False
print(isinstance(data, User)) # True
print("-----------------------")
print(data.__class__)
print(data.__tablename__)
print(data.__table__)
print(dir(data))
print(data.__dict__)
print("-----------------------")
print("to_json:", data.to_json()) # 每种方式都可以单独使用,直接jsonify(data)就行
print("to_dict:", data.to_dict())
return jsonify(data)
@app.route('/2')
def list():
data = User.query.paginate(1, 10, False)
print(type(data), data) # Pagination
print(type(data.items), data.items) # list
print("-----------------------")
print(isinstance(data.__class__, DeclarativeMeta)) # False
print(isinstance(data, DeclarativeMeta)) # False
print(isinstance(data.__class__, Query)) # False
print(isinstance(data, Query)) # False
print(isinstance(data, Pagination)) # True
return jsonify(data.items) # 需要先.items获取结果列表,在放入jsonify中
if __name__ == '__main__':
app.run(debug=True)
参考链接
https://blog.csdn.net/luanxiyuan/article/details/80434767
https://www.cnblogs.com/StupidsCat/p/7125233.html
https://blog.csdn.net/liu_xing_hui/article/details/8956107
sqlalchemy 转json 的几种常用方式的更多相关文章
- Postman几种常用方式
Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...
- .Net中XML,JSON的几种处理方式
一.XML: 1.基本了解: xml,Extensible markup language可扩展标记语言,用于数据的传输或保存,特点,格式非常整齐数据清晰明了,并且任何语言都内置了xml分析引擎, 不 ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
- iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤
1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...
- iOS- 网络请求的两种常用方式【GET & POST】的区别
GET和POST 网络请求的两种常用方式的实现[GET & POST] –GET的语义是获取指定URL上的资源 –将数据按照variable=value的形式,添加到action所指向的URL ...
- js中Json字符串如何转成Json对象(4种转换方式)
js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...
- JSON的三种解析方式
一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定 ...
- 第63天:json的两种声明方式
一. json 两种声明方式 1. 对象声明 var json = {width:100,height:100} 2. 数组声明 var man = [ // 数组的 js ...
随机推荐
- POST接口底层方法
对于POST请求的接口,我们如何调用它获取到数据,这其中自然少不了底层代码 底层公共类的书写 public class ThirdOpenAPIService { public static Thir ...
- HDU 4864 Task(经典贪心)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS (Java/Others) M ...
- 修改office文档修改日期
修改“创建日期”可采用如下方法: 首先把系统日期调整到您所希望的时间,然后到MS-DOS方式下,对该文件输入如下命令:COPY /B filename +,, (一个加号.两个逗号),当询问您是否确认 ...
- 能成为一名合格的Java架构师
原文地址:http://www.dalbll.com/Group/Topic/ArchitecturedDesign/4943 俗话说“没有见过好程序,怎么可能写出好程序”,同样,也可以说“不了解架构 ...
- iOS原生混合RN开发最佳实践
iOS原生混合RN开发详解 做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 ...
- 初窥UIKit Dynamics
原文来自这里. iOS7中可以方便的给物体添加动态物理特性,主要使用到UIDynamicAnimator,UIDynamicBehavior以及实现了UIDynamicItem协议的对象.在iOS7中 ...
- 一、Vue项目构建
Attention:以下内容为Mac机上运行,windows可能有所偏差- Step1 打开终端,键入npm install -g vue-cli,使用vue-cli脚手架搭建vue项目能省很多事儿- ...
- 使用Letsencrypt做SSL certificate
为什么要使用Letsencrypt做SSL certificate? 最简单直接的原因是免费.但是免费存在是否靠谱的问题,尤其是对安全要求比较高的网站,需要考虑使用letsencrypt的安全性是否符 ...
- 阿里云Windows远程连接出现身份验证错误,要求的函数不正确”的报错。
最近很多阿里云用户在远程Windows Server的云服务器ECS时出现“身份验证错误,要求的函数不受支持”的报错. 这个问题解决起来非常简单,修改组策略中的一个配置就可以了. 在运行中输入gped ...
- PHP中如何对二维数组按某个键值进行排序
$arr=[ array( 'name'=>'张三', 'age'=>28 ), array( 'name'=> ...