From e1bf3d159eda304e8af6d3fbfe2768ac13577b19 Mon Sep 17 00:00:00 2001 From: Heiko Ludwig Date: Mon, 11 Aug 2025 11:09:44 +0200 Subject: [PATCH] done: Define and Access the Database --- flaskr/__init__.py | 3 +++ flaskr/db.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++ flaskr/schema.sql | 17 ++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 flaskr/db.py create mode 100644 flaskr/schema.sql diff --git a/flaskr/__init__.py b/flaskr/__init__.py index ba1f57c..d79bd32 100644 --- a/flaskr/__init__.py +++ b/flaskr/__init__.py @@ -31,4 +31,7 @@ def create_app(test_config=None): def hello(): return 'Hello, World!' + from . import db + db.init_app(app) + return app diff --git a/flaskr/db.py b/flaskr/db.py new file mode 100644 index 0000000..09b73fa --- /dev/null +++ b/flaskr/db.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +import sqlite3 +from datetime import datetime + +import click +from flask import current_app, g + + +def get_db(): + 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): + db = g.pop('db', None) + + if db is not None: + db.close() + + +def init_db(): + 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(): + """Clear the 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): + app.teardown_appcontext(close_db) + app.cli.add_command(init_db_command) + diff --git a/flaskr/schema.sql b/flaskr/schema.sql new file mode 100644 index 0000000..be76d7e --- /dev/null +++ b/flaskr/schema.sql @@ -0,0 +1,17 @@ +DROP TABLE IF EXISTS user; +DROP TABLE IF EXISTS post; + +CREATE TABLE user ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE NOT NULL, + password TEXT NOT NULL +); + +CREATE TABLE post ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + author_id INTEGER NOT NULL, + created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + title TEXT NOT NULL, + body TEXT NOT NULL, + FOREIGN KEY (author_id) REFERENCES user (id) +);