Python中SQLAlchemy的方法封装有现成的库吗?
每次在这问问题,我都有点问的不好意思了;但是还是要问;
flask 框架,SQLAlchemy,用 mysql ;
那么问题来了,是不是视图的每一个查询都要建立一个对应的 SQLAlchemy 模型来处理?
比如,我要对 users 表进行添加、查询、更新;
# models.py
class users(db.Model):
# 定义表名
tablename = ‘users’
# id 是主键 db.Column 是字段名,db.INT 是数据类型
id = db.Column(db.INT, primary_key=True)
username= db.Column(db.String(255), unique=False)
password = db.Column(db.String(255), unique=False)
ip = db.Column(db.String(255), unique=False)
title = db.Column(db.String(255), unique=False)
status = db.Column(db.String(255), default=1)
update_time = db.Column(db.String(255), default=int(time.time()))
create_time = db.Column(db.String(255), unique=False)
我查询全部的时候是,得出的结果类型是 list
from App.main.users import models
data = models.users.query.all()
我查询单条的时候是一个得出的类型是一个 class
from App.main.users import models
data = models.users.query.filter_by(id=1).first()
话说那这个单条我怎么取结果呢?
我就想各位大神发点 github 的 flask+mysql 的项目给我看看你们是怎么写的。
Python中SQLAlchemy的方法封装有现成的库吗?
原来还能在 model 里面写
def all(cls):
return users.query.all()
有,SQLAlchemy本身的设计就鼓励封装,你可以直接用它的declarative_base和sessionmaker来构建自己的数据访问层。不过,如果你想要更“现成”的、类似Django ORM那种风格的封装,有几个库可以看看:
- SQLAlchemy-Mixins:这个库提供了一堆现成的mixin类,比如
TimestampMixin(自动加created_at和updated_at字段)、SmartQueryMixin(增强查询)等,直接继承就能用,能省不少样板代码。 - SQLAlchemy-Utils:它不完全是高层封装,但提供了超多有用的字段类型(如IPAddress、ChoiceType)、函数和验证器,能大大简化模型定义。
- 你自己写的基类:其实更常见的做法是,根据项目需求自己封装一个BaseModel。比如,统一给所有模型加上ID、时间戳,或者封装一些通用的查询方法(像
find_by_id、filter_by_conditions)。这样最灵活,也最符合你的业务逻辑。
简单说,SQLAlchemy-Mixins最接近你要的“现成方法封装”,拿来即用。
可以为每个模型类定义一个 tojson 函数
模型多的时候同问有什么优雅的实现方法吗?
外部写一个 tojson,传入 obj 类型,读取每个 propty
弄一个抽象基类。所有模型都继承自基类。
class BaseModel(db.Model):
abstract = True
def jsonify():
pass
楼主的问题,我想说 data 已经是数据了。data.id 已经可以读取属性了。如果是想打印结果的话,可以重写__repr__方法
class BaseModel(object):
def init(self, **kwargs):
self.add_attr(**kwargs)
def add_attr(self, **kwargs):
for key in kwargs.keys():
setattr(self, key, kwargs[key])
query = db_session.query_property()
def convert_to_dict(self):
d = self.dict
d.pop(’_sa_instance_state’)
return d
#2
Model 继承下面的类
<script src=“https://gist.github.com/Caratpine/47f4ecdb6073397b41576ba2ee44d76a.js”></script>
#2
class JSONSerializer(object):
json_public = None
json_hidden = None
json_default_modifiers = {}
json_custom_modifiers = {}
def get_field_names(self):
for p in self.mapper.iterate_properties:
yield p.key
def to_json(self):
field_names = self.get_field_names()
public = self.json_public or field_names
hidden = self.json_hidden or []
self.json_default_modifiers.update(self.json_custom_modifiers)
modifiers = self.json_default_modifiers
rs = dict()
for key in public:
rs[key] = getattr(self, key)
for key, callback in modifiers.items():
if hasattr(self, key):
value = getattr(self, key)
rs[key] = callback(value)
for key in hidden:
rs.pop(key, None)
return rs
序列化的话,用 marshmallow,配套的有 marshmallow-sqlalchemy、flask-marshmallow,用着很方便……

