flask/examples/tutorial/flaskr/db.py
sebacry3 57df4824ea Add type hints to tutorial and Javascript examples
- Add return type annotations and parameter
  types
 - Import necessary typing modules (Optional,
 Union, Flask, Response)
 - Improve code readability and IDE support for
   examples
 - All existing tests continue to pass
2025-09-26 11:10:23 -05:00

58 lines
1.4 KiB
Python

import sqlite3
from datetime import datetime
import click
from flask import current_app
from flask import g
from flask import Flask
def get_db() -> sqlite3.Connection:
"""Connect to the application's configured database. The connection
is unique for each request and will be reused if this is called
again.
"""
if "db" not in g:
g.db = sqlite3.connect(
current_app.config["DATABASE"], detect_types=sqlite3.PARSE_DECLTYPES
)
g.db.row_factory = sqlite3.Row
return g.db
def close_db(e=None) -> None:
"""If this request connected to the database, close the
connection.
"""
db = g.pop("db", None)
if db is not None:
db.close()
def init_db() -> None:
"""Clear existing data and create new tables."""
db = get_db()
with current_app.open_resource("schema.sql") as f:
db.executescript(f.read().decode("utf8"))
@click.command("init-db")
def init_db_command() -> None:
"""Clear existing data and create new tables."""
init_db()
click.echo("Initialized the database.")
sqlite3.register_converter("timestamp", lambda v: datetime.fromisoformat(v.decode()))
def init_app(app: Flask) -> None:
"""Register database functions with the Flask app. This is called by
the application factory.
"""
app.teardown_appcontext(close_db)
app.cli.add_command(init_db_command)