feat: ensure_db() — автосоздание БД при старте

This commit is contained in:
2026-06-13 12:46:18 +04:00
parent c7fbc4dc07
commit b5c007044f
2 changed files with 36 additions and 10 deletions
+1
View File
@@ -9,6 +9,7 @@ load_dotenv()
class ContractsApp: class ContractsApp:
def __init__(self): def __init__(self):
self.app = Flask(__name__) self.app = Flask(__name__)
db.ensure_db()
self.add_routes() self.add_routes()
def add_routes(self): def add_routes(self):
+35 -10
View File
@@ -3,22 +3,47 @@ import psycopg2
from psycopg2 import sql from psycopg2 import sql
def _pg_connect(dbname):
"""Сырое подключение к указанной базе."""
return psycopg2.connect(
host=os.getenv("DB_HOST"),
port=os.getenv("DB_PORT", 5432),
dbname=dbname,
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASS"),
sslmode=os.getenv("DB_SSLMODE", "disable"),
)
def connect(): def connect():
"""Подключение к БД. Возвращает (connection, None) или (None, error).""" """Подключение к целевой БД. Возвращает (connection, None) или (None, error)."""
try: try:
conn = psycopg2.connect( return _pg_connect(os.getenv("DB_NAME")), None
host=os.getenv("DB_HOST"),
port=os.getenv("DB_PORT", 5432),
dbname=os.getenv("DB_NAME"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASS"),
sslmode=os.getenv("DB_SSLMODE", "disable"),
)
return conn, None
except Exception as e: except Exception as e:
return None, str(e) return None, str(e)
def ensure_db():
"""Создать базу, если не существует."""
db_name = os.getenv("DB_NAME", "contracts")
try:
conn = _pg_connect("postgres")
conn.autocommit = True
cur = conn.cursor()
cur.execute("SELECT 1 FROM pg_database WHERE datname = %s", (db_name,))
if cur.fetchone():
print(f"DB '{db_name}' exists")
else:
cur.execute(sql.SQL("CREATE DATABASE {}").format(sql.Identifier(db_name)))
print(f"DB '{db_name}' created")
cur.close()
conn.close()
return True
except Exception as e:
print(f"ensure_db error: {e}")
return False
def query(sql_text, params=None): def query(sql_text, params=None):
"""Выполнить запрос, вернуть (result, error).""" """Выполнить запрос, вернуть (result, error)."""
conn, err = connect() conn, err = connect()