Get models by ID from the database using SQLAlchemy
Using the model class's query attribute, we have access to two very handy methods:
ItemModel.query.get(item_id)gives us anItemModelobject from the database where theitem_idmatches the primary key.ItemModel.query.get_or_404(item_id)does the same, but makes Flask immediately return a "Not Found" message, together with a 404 error code, if no model can be found with that ID in the database.
tip
When we use .get_or_404() and nothing is found, this is the response from the API:
{"code": 404, "status": "Not Found"}
The status code of this response is also 404.
We're going to use .get_or_404() repeatedly in our resources!
For now, and since we'll need an ItemModel instance in all our Item resource methods, let's add that:
resources/item.py
@blp.route("/item/<string:item_id>")
class Item(MethodView):
@blp.response(200, ItemSchema)
def get(self, item_id):
item = ItemModel.query.get_or_404(item_id)
return item
def delete(self, item_id):
item = ItemModel.query.get_or_404(item_id)
raise NotImplementedError("Deleting an item is not implemented.")
@blp.arguments(ItemUpdateSchema)
@blp.response(200, ItemSchema)
def put(self, item_data, item_id):
item = ItemModel.query.get_or_404(item_id)
raise NotImplementedError("Updating an item is not implemented.")
Similarly in our Store resource:
resources/store.py
@blp.route("/store/<string:store_id>")
class Store(MethodView):
@blp.response(200, StoreSchema)
def get(self, store_id):
store = StoreModel.query.get_or_404(store_id)
return store
def delete(self, store_id):
store = StoreModel.query.get_or_404(store_id)
raise NotImplementedError("Deleting a store is not implemented.")
With this, we're ready to continue!