0

I am trying to insert default data into table while running the migration.I am using flask migration to do this.

I am using below file/folder structure

/src
   |_ admin/
       |_ __init__.py
       |_ forms.py
       |_ views.py
   |_ core/
       |_ __init__.py
       |_ forms.py
       |_ views.py
   |_ static/
   |_ students/
      |_ __init__.py
      |_ forms.py
      |_ views.py
   |_ templates/
      |_ admin/
      |_ students/
   |_ __init__.py
   |_ models.py
|_ app.py

app.py

from src import app


if __name__ == '__main__':
    app.run(debug=True)

models.py

from src import db
from werkzeug.security import check_password_hash,generate_password_hash
from flask_login import UserMixin
from datetime import datetime

class AdminUser(db.Model,UserMixin):
    __tablename__ = 'admin_users'
    id = db.Column(db.Integer,primary_key=True)
    full_name = db.Column(db.String(50))
    email = db.Column(db.String(50))
    password = db.Column(db.String(128))

    def __init__(self,fullname,email,password):
        self.full_name = fullname
        self.email = email
        self.password = generate_password_hash(password)
    
    def check_password(self,password):
        return check_password_hash(self.password,password)
    

class Classes(db.Model):
    __tablename__ = 'classes'
    id = db.Column(db.Integer,primary_key=True)
    class_name = db.Column(db.String(30))

    def __init__(self,className):
        self.class_name = className

class Divisions(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    division_name = db.Column(db.String(30))

    def __init__(self,divisionName):
        self.division_name = divisionName

class Homework(db.Model):
    __tablename__ = 'homeworks'
    id = db.Column(db.Integer,primary_key=True)
    subject = db.Column(db.String(50))
    question = db.Column(db.String(500))
    class_id = db.Column(db.Integer,db.ForeignKey('classes.id'),nullable=False)
    division_id = db.Column(db.Integer,db.ForeignKey('divisions.id'),nullable=False)
    last_date = db.Column(db.DateTime)
    created_on = db.Column(db.DateTime,default=datetime.utcnow)

    def __init__(self,subject,question,classId,divisionId,lastDate):
        self.subject = subject
        self.question = question
        self.class_id = classId
        self.division_id = divisionId
        self.last_date = lastDate
    
class Student(db.Model,UserMixin):
    __tablename__ = 'students'

    id = db.Column(db.Integer,primary_key=True)
    full_name = db.Column(db.String(50))
    email = db.Column(db.String(50))
    mobile = db.Column(db.String(15))
    password = db.Column(db.String(128))
    class_id = db.Column(db.Integer,db.ForeignKey('classes.id'),nullable=False)
    division_id = db.Column(db.Integer,db.ForeignKey('divisions.id'),nullable=False)

    def __init__(self,fullName,emailAddress,mobileNumber,classID,divisionID):
        self.full_name = fullName
        self.email = emailAddress
        self.mobile = mobileNumber
        password = mobileNumber[6:]
        self.password = generate_password_hash(password)
        self.class_id = classID
        self.division_id = divisionID

    def check_password(self,password):
        return check_password_hash(self.password,password)

class StudentHomeWorks(db.Model):

    __tablename__ = 'student_homework'

    id = db.Column(db.Integer,primary_key=True)
    student_id = db.Column(db.Integer,db.ForeignKey('students.id'),nullable=False)
    homework_id = db.Column(db.Integer,db.ForeignKey('homeworks.id'),nullable=False)
    answer = db.Column(db.Text)
    image = db.Column(db.String(100))
    submitted_date = db.Column(db.Date,default=datetime.utcnow)

    def __init__(self,studenID,homeworkID,answer,image):
        self.student_id = studenID
        self.homework_id = homeworkID
        self.answer = answer
        self.image = image

src/init.py

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate


app = Flask(__name__)

app.config['SECRET_KEY'] = 'mysecretkey'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/student_mgmt'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
Migrate(app,db)

login_manager = LoginManager()
login_manager.init_app(app)


from src.core.views import homeBluePrint
from src.admin.views import adminBluePrint
from src.students.views import studentBluePrint
app.register_blueprint(homeBluePrint)
app.register_blueprint(studentBluePrint)
app.register_blueprint(adminBluePrint)


@login_manager.user_loader
def load_user(user_id):
    
    from src.models import Student
    student = Student.query.get(user_id)
    return student

After surfing on the internet i found out that we can user before_first_request or seed. But couldn't understand how and where to use it.

Heres's the app.py

from src import app,db
from src.models import AdminUser


if __name__ == '__main__':
    app.run(debug=True)

    @app.before_first_request
    def populate_db():
        user = AdminUser(fullname='Admin',email='admin@admin.com',password='Admin@1234')

        db.session.add(user)
        db.session.commit()

The tables get created but data is not getting inserted.

0 Answers0