1
0
Fork 0
mirror of https://github.com/EDeev/web-dev.git synced 2026-10-07 20:49:38 +03:00
web-dev/ex/db/db_seed.py
2026-06-16 14:14:59 +03:00

70 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Инициализация БД: создание таблиц, ролей, жанров и тестовых пользователей.
Запускать: 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_<ROLE>_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()