article

Wednesday, February 12, 2020

Python Flask Datatable using SQLalchemy With Mysql


Python Flask Datatable using SQLalchemy With Mysql

First you need to install flask, and after that you need to install flask-sqlalchemy.

pip install Flask

pip install Flask-SQLAlchemy


#app.py
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
 
app = Flask(__name__)
app.secret_key = "cairocoders-ednalan-06300131"
 
#SqlAlchemy Database Configuration With Mysql
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:''@localhost/testingdb'
                                        #mysql+pymysql://username:passwd@host/databasename 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 
db = SQLAlchemy(app)
 
#Creating model table for our CRUD database
class Employee(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    email = db.Column(db.String(100))
    phone = db.Column(db.String(100))
 
    def __init__(self, name, email, phone):
        self.name = name
        self.email = email
        self.phone = phone
 
#query on all our employee data
@app.route('/')
def Index():
    all_data = Employee.query.all()
    return render_template("index.html", employees = all_data)
 
#insert data to mysql database via html forms
@app.route('/insert', methods = ['POST'])
def insert():
    if request.method == 'POST':
        name = request.form['name']
        email = request.form['email']
        phone = request.form['phone']
 
        my_data = Employee(name, email, phone)
        db.session.add(my_data)
        db.session.commit()
 
        flash("Employee Inserted Successfully")
        return redirect(url_for('Index'))
 
#update employee
@app.route('/update', methods = ['GET', 'POST'])
def update():
    if request.method == 'POST':
        my_data = Employee.query.get(request.form.get('id'))
 
        my_data.name = request.form['name']
        my_data.email = request.form['email']
        my_data.phone = request.form['phone']
 
        db.session.commit()
        flash("Employee Updated Successfully")
        return redirect(url_for('Index'))
 
#delete employee
@app.route('/delete//', methods = ['GET', 'POST'])
def delete(id):
    my_data = Employee.query.get(id)
    db.session.delete(my_data)
    db.session.commit()
    flash("Employee Deleted Successfully")
    return redirect(url_for('Index'))
 
if __name__ == "__main__":
    app.run(debug=True)
//index.html
{% extends 'base.html' %}
{% include 'header.html' %}

{% block title %} Home {% endblock %}
 
{% block body %}
<div class="container">
    <div class="row">
        <div class="col md-12">
            <div class="jumbotron p-3">
                <h2>Manage <b>Employees </b>  <button type="button"  class="btn btn-success float-right"
                data-toggle="modal" data-target="#mymodal">Add New Employees</button> </h2>
                {% with messages = get_flashed_messages() %}
                {% if messages %}
                
    {% for message in messages %}
                <div class="alert alert-success alert-dismissable" role="alert">
                    <button type="button" class="close" data-dismiss="alert" aria-label="close">
                        <span aria-hidden="true">x</span>
                    </button>
                {{message}}
                </div>
                {% endfor %}
    
                {% endif %}
                {% endwith %}
 
                <table class="table table-hover table-striped">
                    <tr>
                        <th>ID</th>
                        <th>Name</th>
                        <th>Email</th>
                        <th>Phone</th>
                        <th>Action</th>
                    </tr>
                   {% for row in employees %}
                    <tr>
                        <td>{{row.id}}</td>
                        <td>{{row.name}}</td>
                        <td>{{row.email}}</td>
                        <td>{{row.phone}}</td>
                        <td>
                            <a href="/update/{{row.id}}" class="btn btn-warning btn-xs" data-toggle="modal" data-target="#modaledit{{row.id}}">Edit</a>
                            <a href="/delete/{{row.id}}" class="btn btn-danger btn-xs" onclick="return confirm('Are You Sure To Delete ?')">Delete</a>
                        </td>
                    </tr>
     <!-- Modal Edit Employee-->
     <div id="modaledit{{row.id}}" class="modal fade" role="dialog">
        <div class="modal-dialog">
        <div class="modal-content">
       <div class="modal-header"><h4 class="modal-title">Update Information</h4></div>
        <div class="modal-body">
        <form action="{{url_for('update')}}" method="POST">
         <div class="form-group">
          <label>Name:</label>
          <input type="hidden"  name="id" value="{{row.id}}">
          <input type="text" class="form-control" name="name" value="{{row.name}}">
         </div>
         <div class="form-group">
          <label>Email:</label>
          <input type="text" class="form-control" name="email" value="{{row.email}}">
         </div>
         <div class="form-group">
          <label>Phone:</label>
          <input type="text" class="form-control" name="phone" value="{{row.phone}}">
         </div>
         <div class="form-group">
          <button class="btn btn-primary" type="submit">Update</button>
         </div>
        </form>
        </div>
        <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        </div>
      </div>
      </div>
     </div> 
     {% endfor %}
    </table>
   </div>
 
  <!-- Modal Add Employee-->
  <div id="mymodal" class="modal fade" role="dialog">
      <div class="modal-dialog">
     <div class="modal-content">
    <div class="modal-header"><h4 class="modal-title">Add Employee</h4></div>
    <div class="modal-body">
     <form action="{{url_for('insert')}}" method="POST">
      <div class="form-group">
       <label>Name:</label>
       <input type="text" class="form-control" name="name" required="1">
      </div>
      <div class="form-group">
       <label>Email:</label>
       <input type="email" class="form-control" name="email" required="1">
      </div>
      <div class="form-group">
       <label>Phone:</label>
       <input type="number" class="form-control" name="phone" required="1">
      </div>
      <div class="form-group">
      <button class="btn btn-primary" type="submit">Add Employee</button>
      </div>
     </form>
    </div>
    <div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    </div>
   </div>
   </div>
  </div>
  
 </div>
 </div>
</div>
{% endblock %}
//base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} </title>
</head>
<body>
{% block body %} {% endblock %}
 
 
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
 
</body>
</html>
//header.html
{% extends 'base.html' %}

{% block title %} Python Flask Datatable {% endblock %}

{% block body %}
<div class="jumbotron p-3">
    <div class="well text-center">
        <h1>Python Flask Datatable using SQLalchemy With Mysql</h1>
    </div>
</div>
{% endblock %}

Related Post