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的方法封装有现成的库吗?

9 回复

原来还能在 model 里面写

def all(cls):
return users.query.all()


有,SQLAlchemy本身的设计就鼓励封装,你可以直接用它的declarative_basesessionmaker来构建自己的数据访问层。不过,如果你想要更“现成”的、类似Django ORM那种风格的封装,有几个库可以看看:

  1. SQLAlchemy-Mixins:这个库提供了一堆现成的mixin类,比如TimestampMixin(自动加created_atupdated_at字段)、SmartQueryMixin(增强查询)等,直接继承就能用,能省不少样板代码。
  2. SQLAlchemy-Utils:它不完全是高层封装,但提供了超多有用的字段类型(如IPAddress、ChoiceType)、函数和验证器,能大大简化模型定义。
  3. 你自己写的基类:其实更常见的做法是,根据项目需求自己封装一个BaseModel。比如,统一给所有模型加上ID、时间戳,或者封装一些通用的查询方法(像find_by_idfilter_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,用着很方便……

回到顶部