Initial income_calculator project
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
3
backend/db/__init__.py
Normal file
3
backend/db/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from .database import init_db, get_connection
|
||||
|
||||
__all__ = ["init_db", "get_connection"]
|
||||
74
backend/db/database.py
Normal file
74
backend/db/database.py
Normal file
@@ -0,0 +1,74 @@
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from backend.config import DATABASE_PATH
|
||||
|
||||
|
||||
def get_connection() -> sqlite3.Connection:
|
||||
conn = sqlite3.connect(DATABASE_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
|
||||
def init_db() -> None:
|
||||
Path(DATABASE_PATH).parent.mkdir(parents=True, exist_ok=True)
|
||||
conn = get_connection()
|
||||
try:
|
||||
conn.executescript("""
|
||||
CREATE TABLE IF NOT EXISTS banks (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
code TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL,
|
||||
is_salary INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS accounts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
bank_id INTEGER NOT NULL REFERENCES banks(id),
|
||||
external_id TEXT NOT NULL,
|
||||
name TEXT,
|
||||
UNIQUE(bank_id, external_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS opening_balances (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
account_id INTEGER NOT NULL REFERENCES accounts(id),
|
||||
period_start TEXT NOT NULL,
|
||||
amount REAL NOT NULL,
|
||||
UNIQUE(account_id, period_start)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS transactions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
account_id INTEGER NOT NULL REFERENCES accounts(id),
|
||||
operation_date TEXT NOT NULL,
|
||||
debit_date TEXT,
|
||||
amount REAL NOT NULL,
|
||||
currency TEXT DEFAULT 'RUB',
|
||||
amount_card_currency REAL,
|
||||
description TEXT,
|
||||
source_file TEXT NOT NULL,
|
||||
imported_at TEXT NOT NULL,
|
||||
dedup_key TEXT NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_account ON transactions(account_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_operation_date ON transactions(operation_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_dedup ON transactions(dedup_key);
|
||||
""")
|
||||
conn.commit()
|
||||
try:
|
||||
conn.execute("ALTER TABLE transactions ADD COLUMN excluded_from_balance INTEGER NOT NULL DEFAULT 0")
|
||||
conn.commit()
|
||||
except sqlite3.OperationalError:
|
||||
pass
|
||||
conn.executescript("""
|
||||
CREATE TABLE IF NOT EXISTS app_settings (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT
|
||||
);
|
||||
""")
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user