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——有几个PAT

    思路来源:https://www.cnblogs.com/asinlzm/p/4440603.html 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6 ...

  2. Jmeter--随机生成浮点数

    post接口中需要随机生成目标对象的地理位置: 所以就使用了javaScript函数,如下所示: { "Location": { "Altitude": ${_ ...

  3. JQuery给一个元素绑定两次点击事件(第二次点击事件)

    由于项目的要求,需要给复选框设置样式,初始样式:,第一次点击的时候显示,第二次点击时候需要改变该样式:. 设计思路: 当点击次数为奇数时显示带有颜色的图片 当点击次数为偶数时显示没有颜色的图片 下边是 ...

  4. oracle整理

    1.安装oracle数据库2.创建数据库实例(可选)3.创建用户.角色.授权(可选) 查询数据库名:select name,dbid from v$database;查询实例名 :select ins ...

  5. LeetCode 中级 - 优势洗牌(870)

    给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 2: 输入: ...

  6. LightOJ 1118--Incredible Molecules(两圆相交)

    1118 - Incredible Molecules      PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Lim ...

  7. 断言assert()与调试帮助

    列表内容assert()是一种预处理宏(preprocessor marco),使用一个表达式来作为条件,只在DEBUG模式下才有用. assert(expr); 对expr求值,如果expr为假,则 ...

  8. POJ 3528--Ultimate Weapon(三维凸包)

    Ultimate Weapon Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 2430   Accepted: 1173 ...

  9. CentOS7 更换阿里云源

    搭建opensack时原生的源不好使就换了个阿里云的源试试 百度搜到的方法:https://blog.csdn.net/chavo0/article/details/51939362 1.备份 # m ...

  10. Java : Spring基础 IOC

    使用 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml" ...