""" Инициализация БД: создание таблиц, ролей, жанров и тестовых пользователей. Запускать: python db_seed.py """ import sqlite3 import os import secrets from werkzeug.security import generate_password_hash DB = os.path.join(os.path.dirname(__file__), 'library.db') SCHEMA = os.path.join(os.path.dirname(__file__), 'schema.sql') def _pwd(role): """Пароль тестового пользователя: из SEED__PASSWORD или случайный.""" return os.environ.get(f'SEED_{role}_PASSWORD') or secrets.token_urlsafe(8) def init(): conn = sqlite3.connect(DB) conn.row_factory = sqlite3.Row conn.execute('PRAGMA foreign_keys = ON') with open(SCHEMA, encoding='utf-8') as f: conn.executescript(f.read()) # Роли roles = [ ('администратор', 'Суперпользователь, полный доступ'), ('модератор', 'Может редактировать книги и модерировать рецензии'), ('пользователь', 'Может оставлять рецензии'), ] for name, desc in roles: conn.execute( 'INSERT OR IGNORE INTO roles (name, description) VALUES (?,?)', (name, desc) ) # Жанры genres = [ 'Фантастика', 'Фэнтези', 'Детектив', 'Роман', 'Приключения', 'Ужасы', 'Исторический', 'Научная литература', 'Биография', 'Поэзия' ] for g in genres: conn.execute('INSERT OR IGNORE INTO genres (name) VALUES (?)', (g,)) # Тестовые пользователи users = [ ('admin', _pwd('ADMIN'), 'Деев', 'Егор', 'Викторович', 'администратор'), ('moder', _pwd('MODER'), 'Иванов', 'Иван', 'Иванович', 'модератор'), ('user1', _pwd('USER'), 'Петров', 'Пётр', None, 'пользователь'), ] for login, pwd, last, first, middle, role_name in users: role = conn.execute('SELECT id FROM roles WHERE name=?', (role_name,)).fetchone() if role: conn.execute( '''INSERT OR IGNORE INTO users (login, password_hash, last_name, first_name, middle_name, role_id) VALUES (?,?,?,?,?,?)''', (login, generate_password_hash(pwd), last, first, middle, role['id']) ) conn.commit() conn.close() print('БД инициализирована.') print('Логины:', ', '.join(f'{u[0]}/{u[1]}' for u in users)) if __name__ == '__main__': init()