Add persistent PostgreSQL stack and SQLite migration
This commit is contained in:
@@ -4,7 +4,7 @@ from datetime import date, datetime, timedelta
|
||||
from functools import wraps
|
||||
|
||||
from flask import Flask, jsonify, redirect, render_template, request, session, url_for
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy import URL, inspect, text
|
||||
from werkzeug.security import check_password_hash, generate_password_hash
|
||||
|
||||
from models import InternetConnection, Phone, User, db
|
||||
@@ -59,7 +59,7 @@ def get_or_create_secret_key():
|
||||
|
||||
def create_app():
|
||||
app = Flask(__name__)
|
||||
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_PATH}"
|
||||
app.config["SQLALCHEMY_DATABASE_URI"] = get_database_uri()
|
||||
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
||||
app.config["JSON_SORT_KEYS"] = False
|
||||
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=30)
|
||||
@@ -79,7 +79,7 @@ def create_app():
|
||||
def run_migrations():
|
||||
"""Lightweight in-place migrations for columns added after the DB was first created.
|
||||
db.create_all() only creates missing tables, not missing columns on existing tables."""
|
||||
existing_columns = {row[1] for row in db.session.execute(text("PRAGMA table_info(phones)")).fetchall()}
|
||||
existing_columns = {column["name"] for column in inspect(db.engine).get_columns("phones")}
|
||||
if "comment" not in existing_columns:
|
||||
db.session.execute(text("ALTER TABLE phones ADD COLUMN comment TEXT"))
|
||||
db.session.commit()
|
||||
@@ -88,6 +88,26 @@ def run_migrations():
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def get_database_uri():
|
||||
"""Use the Docker database service when configured, with SQLite as a local-dev fallback."""
|
||||
database_url = os.environ.get("DATABASE_URL")
|
||||
if database_url:
|
||||
return database_url
|
||||
|
||||
database_host = os.environ.get("TELCO_DB_HOST")
|
||||
if database_host:
|
||||
return URL.create(
|
||||
drivername="postgresql+psycopg2",
|
||||
username=os.environ.get("TELCO_DB_USER", "telco"),
|
||||
password=os.environ.get("TELCO_DB_PASSWORD", "telco"),
|
||||
host=database_host,
|
||||
port=int(os.environ.get("TELCO_DB_PORT", "5432")),
|
||||
database=os.environ.get("TELCO_DB_NAME", "telco"),
|
||||
)
|
||||
|
||||
return f"sqlite:///{DB_PATH}"
|
||||
|
||||
|
||||
def seed_users():
|
||||
"""First-run only: create the initial login accounts if no users exist yet at all."""
|
||||
if User.query.count() > 0:
|
||||
|
||||
Reference in New Issue
Block a user