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 的几种常用方式的更多相关文章

  1. Postman几种常用方式

    Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...

  2. .Net中XML,JSON的几种处理方式

    一.XML: 1.基本了解: xml,Extensible markup language可扩展标记语言,用于数据的传输或保存,特点,格式非常整齐数据清晰明了,并且任何语言都内置了xml分析引擎, 不 ...

  3. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  4. iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤

    1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...

  5. iOS- 网络请求的两种常用方式【GET & POST】的区别

    GET和POST 网络请求的两种常用方式的实现[GET & POST] –GET的语义是获取指定URL上的资源 –将数据按照variable=value的形式,添加到action所指向的URL ...

  6. js中Json字符串如何转成Json对象(4种转换方式)

    js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...

  7. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

    [方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...

  8. JSON的三种解析方式

    一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定 ...

  9. 第63天:json的两种声明方式

    一. json 两种声明方式 1. 对象声明   var  json = {width:100,height:100} 2. 数组声明   var  man = [        //  数组的 js ...

随机推荐

  1. PAT——1001. 害死人不偿命的(3n+1)猜想

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...

  2. 【题解】洛谷P2827 [NOIP2016TG] 蚯蚓(优先队列)

    题目来源:洛谷P2827 思路 阅读理解题 一开始以为是裸的优先队列而已 但是发现维护一个切开并且其他的要分别加上一个值很不方便 而且如果直接用优先队列会TLE3到4个点 自测85分 所以我们需要发现 ...

  3. 微信小程序开发——进阶篇

    由于项目的原因,最近的工作一直围绕着微信小程序.现在也算告一段落,是时候整理一下这段时间的收获了.我维护的小程序有两个,分别是官方小程序和一个游戏为主的小程序.两个都是用了wepy进行开发,就是这个: ...

  4. ARM Linux 大小核切换 ——cortex-A7 big.LITTLE 大小核 切换代码分析

    ARM Linux 大小核切换——cortex-A7 big.LITTLE 大小切换代码分析 8核CPU或者是更多核的处理器,这些CPU有可能不完全对称.有的是4个A15和4个A7,或者是4个A57和 ...

  5. GoBelieve UseID及ImID方案

    GoBelieve: imId = (appid + uid) IM 服务器用(appid + uid)imid做用户的唯一标示 imid是IM平台上沟通的凭证 客户端请求联系人列表后,会有对应uid ...

  6. webpack之理解loader

    我们在写webpack配置文件的时候,应该有注意到经常用到loader这个配置项,那么loader是用来做什么的呢? loader其实是用来将源文件经过转化处理之后再输出新文件. 如果是数组形式的话, ...

  7. mount/umount命令

    挂载及卸载指定的文件系统 mount [选项] [-L<标签>] [-o<选项>] [-t<文件系统类型>] [设备名] [挂载点] umount [挂载点] -a ...

  8. JQuery制作网页——第九章 表单验证

    1.  表单验证:减轻服务器的压力.保证输入的数据符合要求: 2.  常用的表单验证:日期格式.表单元素是否为空.用户名和密码.E-mail地址.身份证号码等: 3.  表单验证的思路: 1.     ...

  9. angularjs中 $watch 和$on 2种监听的区别?

    1.$watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEq ...

  10. PHP对接QQ互联,超级详细!!!

    SDK下载