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 ...
随机推荐
- HDU 1273 漫步森林(数学 找规律)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1273 漫步森林 Time Limit: 2000/1000 MS (Java/Others) M ...
- OSMboxPend()
1. 原型:void *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err) 2. 参数意义: pevent :消息邮箱 timeout ...
- java基础知识(初学)
(小记) 文本文档方式可以下载notepad 在设置-新建-修改默认语言为java 编码为ANSI! java关键字特点:1.完全小写字母.如:public. java标识符:方法的名称,类的名称,变 ...
- 小程序OSS图片上传
图片上传加水印问题,代码如下! chooseImage: function (e) { var that = this; wx.chooseImage({ sizeType: ['original', ...
- 个人对js面向对象和封装插件的用法
做了一段时间的前端了,给自己写代码也总结出来了一点小小的思路,就来分享一下自己的意见和建议了. 面向对象和插件封装其实说到底都是面向对象的思想,但是插件一般是你要用的时候就new 调用出来的.就说一下 ...
- PHP运行原理之Opcodes
在我之前的博客<Laravel5框架性能优化技巧>中提到开启OPcache可以提升php性能.那么为什么开启OPcache就可以提升php运行性能呢?这里就要提到php的运行原理了--Op ...
- php 计算两个文件的相对路径
<?php /** * 计算两个文件的相对路径 */ function relative_path($path1, $path2) { $arr1 = explode('/', dirname( ...
- ACM1004:Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- google friendly testing
https://www.google.com/webmasters/tools/mobile-friendly/?mc_cid=cc21b18877&mc_eid=cf2bbeb9b2 htt ...
- 20154327 Exp7 网络欺诈防范
基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击. 乱连公共场合的免费WiFi容易受到攻击,比如酒店.商场的免费WiFi (2)在日常生活工作中如何防范以上两攻击方法 对于第一种,我 ...