Я использую API-интерфейс flask в качестве точки отдыха для моего приложения Angular. Сейчас я тестирую API. Я протестировал свою точку /users
, чтобы убедиться, что у меня есть все пользователи.
//importing db, app, models, schema etc.
from flask import jsonify, request
@app.route('/users')
def get_users():
# fetching from database
users_objects = User.query.all()
# transforming into JSON-serializable objects
users_schema = UserSchema(many=True)
result = users_schema.dump(users_objects)
# serializing as JSON
return jsonify(result.data)
Это сработало. Однако теперь, когда я пытаюсь получить другие данные (в которых более 9000 объектов ... это не работает (когда я пытаюсь запросить их все). Сначала я просто взял первый элемент
@app.route('/aggregated-measurements')
def get_aggregated_measurements():
aggregated_measurements_objects = AggregatedMeasurement.query.first()
# transforming into JSON-serializable objects
aggregated_measurement_schema = AggregatedMeasurementSchema()
result = aggregated_measurement_schema.dump(aggregated_measurements_objects)
return jsonify(result.data)
Это показало мне первое AggregatedMeasurement. тем не мение, когда я пытаюсь запросить их всех, aggregated_measurements_objects = AggregatedMeasurement.query.all()
Ничего не отображается. Я сделал то же самое на своем ноутбуке jupyter, и что отобразил их. Затем я подумал, что, возможно, это слишком много информации, поэтому я попытался просто ограничить запрос, как этот aggregated_measurements_objects = AggregatedMeasurement.query.all()[:5]
. Это работает на ноутбуке jupyter, но ничего не отображает, когда я попадаю в маршрут.
Я не понимаю, почему, когда я нажимаю точку /users
, я вижу их все, но когда я пытаюсь сделать то же самое для aggregated-measurements
, я ничего не получаю (даже когда я ограничиваю запрос). Я использую flask_sqlalchemy с sqlite db.
** обновить модель и схему **
from datetime import datetime
# ... import db
import pandas as pd
from marshmallow import Schema, fields
class AggregatedMeasurement(db.Model):
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
time = db.Column(db.DateTime, nullable=False)
speed = db.Column(db.Float, nullable=False)
direction = db.Column(db.Float, nullable=False)
# related fields
point_id = db.Column(db.Integer, db.ForeignKey('point.id'), nullable=False)
point = db.relationship('Point',backref=db.backref('aggregated_measurements', lazy=True))
class AggregatedMeasurementSchema(Schema):
id = fields.Int(dump_only=True)
time = fields.DateTime()
speed = fields.Number()
direction = fields.Number()
point_id = fields.Number()
ВТОРОЕ ОБНОВЛЕНИЕ обнаружил ошибку.
Убедившись, что он действительно попадает в базу данных (спасибо @gbozee), я заметил, что на маршруте /aggregated-measurements
, когда я создал схему, я сделал это только для одного объекта. Я забыл включить many = True, как я это сделал в users_schema. Поэтому появилась только одна точка, а когда я попробовал больше, этого не произошло. Я использовал зефир (пакет сериализации объектов).
также, если вы знакомы с pdb
в python, вы можете поставить точку останова сразу после aggregated_measurements_objects = AggregatedMeasurement.query.all()
в вашем представлении, чтобы убедиться, что выполняется вызов базы данных aggregated_measurements_objects = AggregatedMeasurement.query.first();
import pdb; pdb.set_trace()
@gbozee Я обновил пост. Нет, я не знаком с pdb
в Python, но я попробую. Спасибо
Поскольку форматировать код в разделе комментариев сложно, я создал суть, показывающую, что вам нужно сделать. gist.github.com/gbozee/cb516b022ba4fbc865905fc38702c5b5
Как только точка останова была установлена, я проверил aggregated_measurement_objects
, и он дал мне объект с соответствующей информацией из базы данных для этого конкретного объекта. @gbozee
Я только что проверил с помощью `aggregated_measurements_objects = AggregatedMeasurement.query.all ()` и увидел все свои объекты на моей консоли ... хм. Он попадает в мою базу данных, но когда я попадаю в точку, он пуст (только для агрегированных измерений, для пользователей я вижу все в /users
. Я собираюсь дважды проверить свои маршруты.
не могли бы вы вставить модель
AggregatedMeasurement
, чтобы предоставить больше информации.