What is Jinja2?
Jinja2 is a popular template engine for Python. A web template system combines a template with a specific data source to render a dynamic web page. This allows you to pass Python variables into HTML.
- Templating Engine: Jinja2 is a Python templating engine widely used in frameworks like Flask and Django. Supports modular code through template inheritance.
- Flexible Syntax: Offers a flexible syntax for embedding Python-like expressions, fostering dynamic content generation.
- Built-in Filters: Comes with built-in filters for easy data manipulation and formatting directly within templates.
- Control Structures: Supports control structures like loops and conditionals.
- Security Measures: Automatically escapes HTML characters by default, enhancing web application security.
Migrating the database
The first piece of code you must follow is creating and migrating a database. Anytime a developer changes the schema, this code needs to be run in order to update.
Run in terminal rm instance/volumes/**
Then Run “./migrate.sh”
The code below shows what is happening when you run ./migrate.sh
Link to table (better explanation): https://docs.google.com/document/d/1oI6EoxTlOUjNMKxqLVud0AA–YRGDAWfyHU3Dz7VEhM/edit?usp=sharing
Bash export FLASK_APP=main export PYTHONPATH=.:$PYTHONPATH
The first section is for setting up whether you have the proper tools enabled
export
similar to the from
statements used in python, gets an exported library to be used in the current code
if ! command -v sqlite3 &> /dev/null; then
echo "Error: sqlite3 is not installed. Please install it before running this script."
exit 1
fi
In these if
statements, it first gets a small description of the sqlite3 using the command command -v
and then using &>
redirects it into /dev/null if this is not possible with the !
it passes through the if
statement
if ! command -v python3 &> /dev/null; then
echo "Error: python3 is not installed. Please install it before running this script."
exit 1
The echo
command then prints the error message
The exit
command ends the script from running
fi
if ! python3 -m flask --version &> /dev/null; then
echo "Error: Flask is not installed. Please install it before running this script."
exit 1
fi
The -m
gets flask from python and then asks for the version it’s running, other than that it still remains the same below
This next part of the code checks for if you have the proper files enabled
if [ ! -d "migrations" ]; then
echo "Initializing migration for the first time..."
python3 -m flask db init
fi
The -d
checks to see if “migrations” is part of a directory and if due to the !, if not runs the code underneath it
The db init
causes for Flask to create a repository
The -e
checks if the directory exists and is a file for “instances/volumes/sqlite.db” and “instances/volumes/sqlite-backup.db” with the code not finding that putting out an error message
if [ ! -e "instance/volumes/sqlite.db" ] && [ -e "instance/volumes/sqlite-backup.db" ]; then
echo "No sqlite.db found, using sqlite-backup.db to generate the file."
cp "instance/volumes/sqlite-backup.db" "instance/volumes/sqlite.db" </code> <br> <br> The <code>cp</code> command then copies files which it currently does for the files "instance/volumes/sqlite-backup.db" and "instance/volumes/sqlite.db"
The line backup_version=$(sqlite3…
sets up a variable from the data of alembic_version
and selects it from version_num
backup_version=$(sqlite3 instance/volumes/sqlite.db "SELECT version_num FROM alembic_version;")
echo "Version ${backup_version} detected"
python3 -m flask db stamp "${backup_version}" </code> <br> Check if sqlite.db exists .backup before migration <br> <br> <code> elif [ -e "instance/volumes/sqlite.db" ]; then
timestamp=$(date "+%Y%m%d%H%M%S")
backup_file="instance/volumes/sqlite-backup-${timestamp}.db"
sqlite3 instance/volumes/sqlite.db ".backup instance/volumes/sqlite-backup.db"
sqlite3 instance/volumes/sqlite.db ".backup ${backup_file}" fi
python3 -m flask db migrate
python3 -m flask db upgrade
python3 -m flask custom generate_data
</code>
Extra Comments: If the database file exists, it proceeds to create a timestamp to be used in the backup file’s name.
Sets variable timestamp using:
%Y:
Year with century as a decimal number.
%m:
Month as a zero-padded decimal number.
%d:
Day of the month as a zero-padded decimal number.
%H:
Hour (00 to 23).
%M:
Minute (00 to 59).
%S:
Second (00 to 59).
It constructs a backup file name with the format “instance/volumes/sqlite-backup-<timestamp>.db”. Then, it uses sqlite3 to perform a backup of the SQLite database.
After the backup (if needed), the script get’s python to run the final 3 commands, python3 -m flask db migrate
for migrating across databases python3 -m flask db upgrade
to upgrade the database and python3 -m flask custom generate_data
for generating or populating data in the database.
Summary:
Environment Setup: Configures necessary variables for the Flask application.
Dependency Checks: Verifies essential dependencies (sqlite3, python3, Flask) are installed.
Migration Initialization: Sets up Flask database migrations.
Backup and Restore: Handles database restoration from backup if needed.
Database Migration: Applies Flask’s migration commands for schema changes.
Data Generation: Executes a custom command (generate_data) for additional data.