Typer cli
Introduction¶
Besides, having the raw migration system, the sqlify already includes a basic command line interface using the Typer library.
All you need to do is initialize the Migrations
class the call the cli builder with it, then just attach the result
in your cli.
Here is a full example of it, in a file named cli.py
import psycopg2
from sqlify import Session, build_typer_cli, Migrations
import typer
conn = psycopg2.connect("host=localhost dbname=migrations_test user=postgres password=postgres")
sqlify = Session(conn, autocommit=True).session
migrations_service = Migrations(
migrations_path="my_migrations_folder/",
sqlify=sqlify,
)
app = typer.Typer()
app.add_typer(build_typer_cli(migrations_service=migrations_service), name="db")
if __name__ == "__main__":
app()
Then all you need to do is call the script with the defined section name db
in this case
Execute python cli.py db
and you will the the command list
$ python cli.py db
Usage: cli.py db [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
make-migration
migrate
show-migrations
Generating a new migration file¶
To generate a new migration you just need to call the make-migration command
$ python cli.py db make-migration
my_migrations_folder/0001_20220118_1830.sql Created
List remaining migrations¶
This command will only list migration that have not been applied yet
$ python cli.py db show-migrations
Migrations to apply:
- 0001_20220118_1830
- 0002_20220118_1831
Apply all missing migrations¶
This command will always prompt for confirmation before executing any sql code, and it will also display what migrations will be applied
$ python cli.py db migrate
Migrations to apply:
- 0001_20220118_1830
- 0002_20220118_1831
Are you sure you want to continue? [y/N]:
After confirmation the command will output the applied migrations again
$ python cli.py db migrate
Migrations to apply:
- 0001_20220118_1830
- 0002_20220118_1831
Are you sure you want to continue? [y/N]: y
[0001_20220118_1830] Migration Applied
[0002_20220118_1831] Migration Applied
Apply a single migration¶
To apply a migration you must pass the filename of the migration you want to pass.
And there are 3 ways you can pass the migration filename:
- Full name with extension 0001_20220118_1148.sql
- Full name without extension 0001_20220118_1148
- Migration number 1
or 0001
As before, the command will always display what is going to happen and wait for confirmation before any sql is executed.
$ python cli.py db migrate --filename 2
Migrations to apply:
- 0002_20220118_1831
Are you sure you want to continue? [y/N]: y
[0002_20220118_1831] Migration Applied
Apply a fake migration¶
Sometimes to archive 0 downtime when deploying we need to execute some sql changes before even starting the deploy this parameters help with just that.
This way you can execute the migrations manually in the db, and when there's time to sync up, you can call the migrate
command with the --fake
paramter to just mark the migrations as applied without running the actual sql code.
As before, you can run this with a single migration, by passing the filename, or with all the remaining migrations
The command will also print a warning in the terminar to let you know that no sql code will be run.
$ python cli.py db migrate --fake
FAKE is Active
Migrations to apply:
- 0001_20220118_1830
- 0002_20220118_1831
Are you sure you want to continue? [y/N]: y
[0001_20220118_1830] Migration Applied
[0002_20220118_1831] Migration Applied