Как лучше всего обслуживать объединенные данные из нескольких таблиц через Flask? - PullRequest
0 голосов
/ 02 апреля 2020

Я создаю REST API и хочу обслуживать данные из нескольких таблиц, которые имеют определенные отношения. Я не хочу обслуживать все данные из объединенных таблиц, но приходят столбцы из каждой таблицы, отфильтрованные по параметрам запроса. Также я использую flask -marshmallow , чтобы служить данными как json. Таблицы довольно большие и содержат миллионы строк. Я нашел способ объединения таблиц, обслуживания некоторых полей и фильтрации по запросу, но я не знаю, есть ли более эффективный способ сделать это. Я не буду представлять каждый фрагмент кода, потому что это не важно для этой проблемы, остальная часть кода посвящена авторизации токена, регистрации, настройке приложения. Это мой код:

engine_mssql = db.get_engine(bind='mssqldb')
session_mssql = Session(engine_mssql)
# produce our own MetaData object
metadata = MetaData()
# we can reflect it ourselves from a database, using options
# such as 'only' to limit what tables we look at...

metadata.reflect(engine_mssql, schema='kn', only=['PARCEL', 'CADASTRE_MUNICIPALITY', 'MUNICIPALITY'])
# we can then produce a set of mappings from this MetaData.
Base = automap_base(metadata=metadata)

# calling prepare() just sets up mapped classes and relationships.
Base.prepare()

# mapped classes are ready
Parcel, Cadastre_mun, Municipality= Base.classes.PARCEL, Base.classes.CADASTRE_MUNICIPALITY, Base.classes.MUNICIPALITY

# class for serialization
class ParcelSchema(ma.ModelSchema):
    class Meta:
        fields = tuple(['ParcID', 'CmID', ParcNum',
                       'CmName', 'MunName'])


@app.route("/getparc")
@token_required
def getparc(user):
    municipality= request.args.get('municipality')
    cadastre_mun = request.args.get('cadastre_mun')

    parc_schema = ParcelSchema(many=True)
    parc = session_mssql.query(Parcel.ParcID, Parcel.CmID, Parcel.ParcNum,
           Cadastre_mun.CmName, Municipality.MunName)\
        .filter(Municipality.MunName == municipality).filter(Cadastre_mun.CmName==cadastre_mun )\
        .filter(Parcel.CmID== Cadastre_mun.CmID).filter(Cadastre_mun.MunID== Municipality.MunID).all()
    out = parc_schema.dump(parc)
    return jsonify(out)
...