python - 如何使用 Flask-SQLAlchemy 仅选择数据库中的某些列?

标签 python flask sqlalchemy flask-sqlalchemy

我正在使用 flask_restplusflask_sqlalchemy 开发一个 API,并且有一个特殊情况,即某些应用程序应该仅访问 API 中的某些列。

我有一个模型:

class MyModel(db.Model):
    __tablename_ = 'my_table'
    id = db.Column(db.Integer, primary_key=True)
    first_column = db.Column(db.Unicode)
    second_column = db.Column(db.Unicode)

我还指定了要从 API 返回的 flask_resplus' 模型:

my_model = api.model('MyModel',
                    {'first_column': fields.String(),
                     'second_column': fields.String()})

其中 apiflask_restplus' Api 实例,dbflask_sqlachmey的实例。

有时我只想选择某些列,而另一列在作为 JSON 响应返回的 api.model 中为 null

在网上搜索后,我发现两种方法都不适合我的情况: 来自 sqlalchemy.ormload_only(),它以 列表 的形式返回列。因此,我无法返回这些结果,因为我的模型需要一个具有与 my_model 中所述相同键的字典。另一种方法 with_entities() 返回 MyModel 的实例,这是我所需要的,但它在我将该实例传递给 时加载所有列>my_model,因为它只执行惰性选择,即它选择指定的列,但如果需要其他列,它会再次执行查询以获取其他列的值,从而在我的情况下加载,所有列,这不是我想要的。

如何执行仅返回部分列且结果是 db.Model 实例的 SQL SELECT

最佳答案

如果您使用flask-marshmallow 进行序列化,则可以使用包含的(only()) 或排除的(load_only()) 字段列表加载架构。

这是一个粗略的模型,上面有:

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

db = SQLAlchemy()
ma = Marshmallow()

class MyModel(db.Model):
    __tablename_ = 'my_table'
    id = db.Column(db.Integer, primary_key=True)
    first_column = db.Column(db.Unicode)
    second_column = db.Column(db.Unicode)


class MyModelSchema(ma.ModelSchema):
    class Meta:
        model = MyModel

varlist = ['id','first_column']

def somefunction():
    results = MyModel.query.all()
    mymodelschema = MyModelSchema(many=True, only=varlist)
    output = mymodelschema.dump(results).data
    return jsonify(output) # or whatever you're doing with it

以下是 Marshmallow Schema API 的文档,其中有一些选项,包括排除列表中的所有内容,例如:https://marshmallow.readthedocs.io/en/latest/api_reference.html#marshmallow.Schema

关于python - 如何使用 Flask-SQLAlchemy 仅选择数据库中的某些列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634707/

相关文章:

python - SQL炼金术 : column name prefixed on the subquery of union_all of 3 tables

python - 如何使用需要用户定义类型表参数的 SQLAlchemy 调用存储过程

python - 使用子路径在 Apache 反向代理后面重定向 Flask 登录

python - 在到达用户之前过滤 Flask Admin 中的下拉菜单

c# - 如何在 Python Waitress 服务器上调试 (500) 内部服务器错误?

python - SQLAlchemy:加入没有 from 字段的子查询

python - 无法关闭 Mac 上的 wxPython 窗口

python - 使用 UDP 套接字将 C++ 结构转换为 Python

python - 使用 queryset.update 增加日期时间字段

python - 如何在 python 函数中使用 ffmpeg