Я создаю 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)