Source code for ps.herald.database

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from ps.basic import Config

import click
from flask import current_app, g
from flask.cli import with_appcontext


[docs]def get_engine(): """current_app.config['DATABASE'] is already mapped to the ps.basic.Config.herald_sqlite_filename """ if "engine" not in g: # https://stackoverflow.com/questions/34009296/using-sqlalchemy-session-from-flask-raises-sqlite-objects-created-in-a-thread-c g.engine = create_engine( "sqlite:///" + current_app.config["DATABASE"] + "?check_same_thread=False" ) # print(g.engine.url.database ) # print(Config.herald_sqlite_filename) assert g.engine.url.database == Config.herald_sqlite_filename return g.engine
[docs]def close_engine(e=None): engine = g.pop("db", None) if engine is not None: # the engine is already poped - nothing more to do here pass
[docs]def get_session(): engine = get_engine() if "session" not in g: g.session = scoped_session( sessionmaker(autocommit=False, autoflush=False, bind=engine) ) return g.session
[docs]def init_db(): from ps.herald.model import Base engine = get_engine() Base.metadata.create_all(bind=engine)
@click.command("init-db") @with_appcontext def init_db_command(): """Clear the existing data and create new tables.""" init_db() click.echo("Initialized the database.")
[docs]def init_app(app): app.teardown_appcontext(close_engine) app.cli.add_command(init_db_command)