SQLAlchemy 的方法封装有库嘛?

2019-02-18 02:04:32 +08:00
 smallgoogle

每次在这问问题,我都有点问的不好意思了;但是还是要问;

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 的项目给我看看你们是怎么写的。

3189 次点击
所在节点    Python
8 条回复
smallgoogle
2019-02-18 02:28:50 +08:00
原来还能在 model 里面写
@classmethod
def all(cls):
return users.query.all()
sunhk25
2019-02-18 07:41:40 +08:00
可以为每个模型类定义一个 tojson 函数
模型多的时候同问有什么优雅的实现方法吗?
zvcs
2019-02-18 08:18:36 +08:00
@sunhk25 外部写一个 tojson,传入 obj 类型,读取每个 propty
nuance2ex
2019-02-18 08:29:11 +08:00
@sunhk25 弄一个抽象基类。所有模型都继承自基类。

class BaseModel(db.Model):
__abstract__ = True
def jsonify():
pass

楼主的问题,我想说 data 已经是数据了。data.id 已经可以读取属性了。如果是想打印结果的话,可以重写__repr__方法
mxy940127
2019-02-18 09:13:47 +08:00
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
Caratpine
2019-02-18 09:52:56 +08:00
@sunhk25 #2

Model 继承下面的类

<script src="https://gist.github.com/Caratpine/47f4ecdb6073397b41576ba2ee44d76a.js"></script>
Caratpine
2019-02-18 09:54:39 +08:00
@sunhk25 #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

@property
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
l1xnan
2019-02-18 11:21:30 +08:00
序列化的话,用 marshmallow,配套的有 marshmallow-sqlalchemy、flask-marshmallow,用着很方便……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/535961

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX