Flask Connection to DB with SQLAlchemy - RESTful APIs
Flask and SQLAlchemy - RESTful APIs - connect to DB
Flask Shell - create db fist
Run Flask Shell on conda env or venv:
flask shell
>>> from app import db, Menu
>>> db.creat_all() # create db -> app.db is created at this point
>>> Menu.query.all()
[]
To exit flask shell:
ctrl + d
Display GET POST DELETE PUT by screenshot
1. Run flask by(app.py):
```terminal
flask run
```   ## 2. Open POSTMAN   ### 2-1. GET  address: http://127.0.0.1:5000/menus    Click Send Button   Body Section shows a empty list.   <img src="/assets/images/GET_empty_table.png" width="" height="">
2-2. POST
address: http://127.0.0.1:5000/menus 
Fill out body part below address with raw & JSON format like this:
{
    "id":1,
    "name":"Espresso",
    "price": 3800
}
And then Click Send Button shows:

I posted another example for practicing delete method like this:
{
    "id": 2,
    "name": "CafeLatte Venti",
    "price": 9500
}
Letβs GET:

YES. There are two items.
2-3 DELETE
address: http://127.0.0.1:5000/menus/2
!! DELETE method access by ../menus/id
Address should be matched.
I would delete id=2 by using DELETE.
@app.route('/menus/<id>/',methods=['DELETE'])
def delete_user(id):
    menu = Menu.query.filter_by(id=id).first_or_404()
    db.session.delete(menu)
    db.session.commit()
    return {
        'success': 'Data deleted successfully'
    }
RESULT:

LETβS GET:

A venti menu deleted from the table.
2-4 PUT
address: http://127.0.0.1:5000/menus/1
Letβs change id=1βs name like this:
{
    "name": "Water",
}
PUT as:

LETβS GET:

DONE
TODO:
- Bad request set up (POST, DELETE, PUT)
- PUT method needs more to be done when get data with some partial changes.
Full code:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# db = SQLAlchemy()
db = SQLAlchemy(app)
app.config['SECRET_KEY'] = 'secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
class Menu(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    name = db.Column(db.String(32), nullable=False)
    price = db.Column(db.Integer, nullable=False)
    def __repr__(self):
        return f"Menu('{self.id}', '{self.name}', '{self.price}')"
@app.route('/menus/')
def get_menus():
    return jsonify([
        {
            'id': menu.id, 'name': menu.name, 'price': menu.price
        } for menu in Menu.query.all()
    ])
@app.route('/menus/<id>/')
def get_a_menu(id):
    print(id)
    menu = Menu.query.filter_by(id=id).first_or_404()
    return {
        'id':menu.id, 'name':menu.name, 'price':menu.price
    }
# import uuid
@app.route('/menus/',methods=['POST'])
def create_user():
    data = request.get_json()
    # if not 'name' in data or not 'price' in data:
    #     return jsonify({
    #         'error': 'Bad Request',
    #         'message': 'Name or Price is not given'
    #     }), 400
    # if len(data['name'])< 2 or len(data['price']) < 2:
    #     return jsonify({
    #         'error': 'Bad Request',
    #         'message': 'Name or Price must be contain minimum of 3 letters'
    #     }), 400
    
    new_menu = Menu(
        id = data['id'],
        name = data['name'],
        price = data['price']
    )
    db.session.add(new_menu)
    db.session.commit()
    return {
        'id': new_menu.id, 'name': new_menu.name, 'price': new_menu.price
    }, 201
@app.route('/menus/<id>/', methods=['PUT'])
def update_user(id):
    data = request.get_json()
    # if 'name' not in data:
    #     return {
    #         'error': 'Bad Request',
    #         'message':'Name field needs to be present'
    #     }, 400
    menu = Menu.query.filter_by(id=id).first_or_404()
    menu.name = data['name']
    # menu.price = data['price']
    
    db.session.commit()
    return jsonify({
        'id': menu.id,
        'name': menu.name,
        'price': menu.price
    })
@app.route('/menus/<id>/',methods=['DELETE'])
def delete_user(id):
    menu = Menu.query.filter_by(id=id).first_or_404()
    db.session.delete(menu)
    db.session.commit()
    return {
        'success': 'Data deleted successfully'
    }
@app.route('/')
def home():
    return {
        'message': 'Welcome to build RESTful APIs with Flask and SQLAlchemy'
    }, 200
if __name__ == '__main__':
    app.run()
Spin-off
Linux cp command
1. file to file
cp file1 file2
2. file into a dir
cp file1 dir1/
3. multiple file into a dir
cp file1 file2 dir1/
3-1. multiple file in a dir with a large amount into a dir
In my case,
I have to copy files in /assets/images directory (current: ../here//assets/images) to a farther directory. (../../../../D/D/D//assets/images)
cp -r src_dir/. ../../dest_dir
flask references:
AWESOME REF: <
https://betterprogramming.pub/building-restful-apis-with-flask-and-sqlalchemy-part-1-b192c5846ddd
flask DB connection with SQLAlchemy: https://velog.io/@poiuyy0420/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Flask-DB-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0SQLAlchemy
Create table with SQLAlchemy: https://velog.io/@ywoosang/Flask-SQLAlchemy-Create-Table
linux cp reference:
 
      
    
Leave a comment