0

我想完全阻止棉花糖查询数据库。

在解释性代码片段下方

from flask_sqlalchemy import SQLAlchemy
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
from flask_restful import Resource

db = SQLAlchemy()

class FooModel(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(256))
    picture = db.Column(db.String(256))
    about = db.Column(db.String(256))

class FooSchema(SQLAlchemyAutoSchema):
    class Meta:
        model = FooModel

class FooRessource(Resource):
    def get(self):
        foo = FooModel(name="Mi", picture="pic", about="ab")
        db.session.add(foo)
        db.session.commit()

        created = FooModel.query.options(db.load_only("name")).first()
        created_data = FooSchema().dump(created)
        return {'data': created_data}

我已经使用SQLALCHEMY_ECHO = True. 现在可以从日志中看到这一点

INFO     sqlalchemy.engine.Engine:log.py:117 INSERT INTO foo_model (name, picture, about) VALUES (%(name)s, %(picture)s, %(about)s) RETURNING foo
_model.id
INFO     sqlalchemy.engine.Engine:log.py:117 [generated in 0.00040s] {'name': 'Mi', 'picture': 'pic', 'about': 'ab'}
INFO     sqlalchemy.engine.Engine:log.py:117 COMMIT
INFO     sqlalchemy.engine.Engine:log.py:117 BEGIN (implicit)
INFO     sqlalchemy.engine.Engine:log.py:117 SELECT foo_model.id AS foo_model_id, foo_model.name AS foo_model_name
FROM foo_model
 LIMIT %(param_1)s
INFO     sqlalchemy.engine.Engine:log.py:117 [generated in 0.00024s] {'param_1': 1}
INFO     sqlalchemy.engine.Engine:log.py:117 SELECT foo_model.picture AS foo_model_picture, foo_model.about AS foo_model_about
FROM foo_model
WHERE foo_model.id = %(pk_1)s
INFO     sqlalchemy.engine.Engine:log.py:117 [generated in 0.00026s] {'pk_1': 1}

如您所见,有两个数据库select查询,一个来自我的资源,另一个来自 Marshmallow。

当我更新我的模式实例时,就像created_data = FooSchema(only="name",)).dump(created)来自 Marshmallow 的查询一样消失了,我想要的内容如下所示。

INFO     sqlalchemy.engine.Engine:log.py:117 INSERT INTO foo_model (name, picture, about) VALUES (%(name)s, %(picture)s, %(about)s) RETURNING foo
_model.id
INFO     sqlalchemy.engine.Engine:log.py:117 [generated in 0.00024s] {'name': 'Mi', 'picture': 'pic', 'about': 'ab'}
INFO     sqlalchemy.engine.Engine:log.py:117 COMMIT
INFO     sqlalchemy.engine.Engine:log.py:117 BEGIN (implicit)
INFO     sqlalchemy.engine.Engine:log.py:117 SELECT foo_model.id AS foo_model_id, foo_model.name AS foo_model_name
FROM foo_model
 LIMIT %(param_1)s
INFO     sqlalchemy.engine.Engine:log.py:117 [generated in 0.00021s] {'param_1': 1}

我想知道是否有一种优雅的方法来告诉棉花糖不要查询数据库并使用实例上的可用数据进行反序列化。我正在从事大型项目,这现在是有问题的,因为 Marshmallow 可以查询许多关系的不需要的数据,从而导致请求超慢。

任何建议、文档推荐或提前将不胜感激。

4

0 回答 0