feat: created_at/created_by — видно время и сервис, добавивший строку
- CREATE TABLE IF NOT EXISTS дополнена колонками:
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
created_by TEXT NOT NULL DEFAULT ''
- ALTER TABLE ... ADD COLUMN IF NOT EXISTS досыпает колонки в уже существующую
таблицу — данные при этом не теряются;
- INSERT пишет created_by из env SERVICE_NAME (задаётся в json_env манифеста),
created_at ставит сама СУБД;
- список записей и UI показывают обе колонки.
Зачем: три приложения (flask / lucee / nodejs) пишут в ОДНУ таблицу — теперь
сразу видно, какое из них и когда добавило строку.
This commit is contained in:
+29
-8
@@ -15,6 +15,10 @@ from flask import Flask, render_template, request, redirect, url_for, g
|
||||
|
||||
VERSION = "1.0.0"
|
||||
TABLE_NAME = os.environ.get("TABLE_NAME", "crud_items")
|
||||
# SERVICE_NAME — какое приложение добавило строку (колонка created_by).
|
||||
# Задаётся в json_env манифеста отдельно для каждого сервиса (flask / lucee / nodejs),
|
||||
# чтобы три приложения, пишущие в ОДНУ таблицу, были различимы.
|
||||
SERVICE_NAME = os.environ.get("SERVICE_NAME", "flask")
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@@ -34,17 +38,33 @@ def get_db():
|
||||
|
||||
|
||||
def init_db():
|
||||
"""CREATE TABLE IF NOT EXISTS — никогда не дропает существующую таблицу."""
|
||||
"""Создать таблицу, если её нет, и досыпать новые колонки.
|
||||
|
||||
Таблица выставочная — кроме id/value храним только две метки:
|
||||
created_at — когда строка добавлена (ставит сама СУБД);
|
||||
created_by — какое приложение её добавило (flask / lucee / nodejs).
|
||||
|
||||
ALTER TABLE ... ADD COLUMN IF NOT EXISTS нужен, чтобы таблица, созданная
|
||||
предыдущей версией приложения, получила новые колонки без потери данных.
|
||||
"""
|
||||
db = get_db()
|
||||
cur = db.cursor()
|
||||
cur.execute(
|
||||
f"""
|
||||
CREATE TABLE IF NOT EXISTS {TABLE_NAME} (
|
||||
id SERIAL PRIMARY KEY,
|
||||
value TEXT NOT NULL DEFAULT ''
|
||||
id SERIAL PRIMARY KEY,
|
||||
value TEXT NOT NULL DEFAULT '',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
created_by TEXT NOT NULL DEFAULT ''
|
||||
)
|
||||
"""
|
||||
)
|
||||
cur.execute(
|
||||
f"ALTER TABLE {TABLE_NAME} ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ NOT NULL DEFAULT now()"
|
||||
)
|
||||
cur.execute(
|
||||
f"ALTER TABLE {TABLE_NAME} ADD COLUMN IF NOT EXISTS created_by TEXT NOT NULL DEFAULT ''"
|
||||
)
|
||||
cur.close()
|
||||
|
||||
|
||||
@@ -65,9 +85,10 @@ def index():
|
||||
action = request.form.get("action", "")
|
||||
|
||||
if action == "create":
|
||||
# created_at ставит СУБД (DEFAULT now()), created_by — имя этого сервиса
|
||||
cur.execute(
|
||||
f"INSERT INTO {TABLE_NAME} (value) VALUES (%s)",
|
||||
(request.form.get("value", ""),),
|
||||
f"INSERT INTO {TABLE_NAME} (value, created_by) VALUES (%s, %s)",
|
||||
(request.form.get("value", ""), SERVICE_NAME),
|
||||
)
|
||||
|
||||
elif action == "update":
|
||||
@@ -90,15 +111,15 @@ def index():
|
||||
edit_id = request.args.get("edit")
|
||||
if edit_id:
|
||||
cur.execute(
|
||||
f"SELECT id, value FROM {TABLE_NAME} WHERE id = %s",
|
||||
f"SELECT id, value, created_at, created_by FROM {TABLE_NAME} WHERE id = %s",
|
||||
(int(edit_id),),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
if row:
|
||||
edit_row = dict(row)
|
||||
|
||||
# Список всех записей
|
||||
cur.execute(f"SELECT id, value FROM {TABLE_NAME} ORDER BY id")
|
||||
# Список всех записей — вместе с метками «когда» и «кем» добавлено
|
||||
cur.execute(f"SELECT id, value, created_at, created_by FROM {TABLE_NAME} ORDER BY id")
|
||||
rows = cur.fetchall()
|
||||
cur.close()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user