mirror of
https://github.com/EDeev/web-dev.git
synced 2026-06-17 05:21:01 +03:00
226 lines
9.5 KiB
Python
226 lines
9.5 KiB
Python
import sqlite3
|
||
import os
|
||
|
||
DB = os.path.join(os.path.dirname(__file__), 'library.db')
|
||
|
||
BOOKS = [
|
||
{
|
||
'title': 'Мастер и Маргарита',
|
||
'description': 'Роман о визите дьявола в советскую Москву и трагической любви Мастера и Маргариты.',
|
||
'year': 1967,
|
||
'publisher': 'YMCA-Press',
|
||
'author': 'Михаил Булгаков',
|
||
'pages': 480,
|
||
'genres': ['Роман', 'Фантастика'],
|
||
},
|
||
{
|
||
'title': '1984',
|
||
'description': 'Антиутопия о тоталитарном обществе, где Большой Брат следит за каждым.',
|
||
'year': 1949,
|
||
'publisher': 'Secker & Warburg',
|
||
'author': 'Джордж Оруэлл',
|
||
'pages': 328,
|
||
'genres': ['Фантастика'],
|
||
},
|
||
{
|
||
'title': 'Преступление и наказание',
|
||
'description': 'Психологический роман о студенте Раскольникове, совершившем убийство и его последствиях.',
|
||
'year': 1866,
|
||
'publisher': 'Русский вестник',
|
||
'author': 'Фёдор Достоевский',
|
||
'pages': 592,
|
||
'genres': ['Роман', 'Детектив'],
|
||
},
|
||
{
|
||
'title': 'Дюна',
|
||
'description': 'Эпическая сага о пустынной планете Арракис и судьбе юного Пола Атрейдеса.',
|
||
'year': 1965,
|
||
'publisher': 'Chilton Books',
|
||
'author': 'Фрэнк Герберт',
|
||
'pages': 688,
|
||
'genres': ['Фантастика', 'Приключения'],
|
||
},
|
||
{
|
||
'title': 'Гарри Поттер и философский камень',
|
||
'description': 'Первая книга о мальчике-волшебнике, который поступает в школу магии Хогвартс.',
|
||
'year': 1997,
|
||
'publisher': 'Bloomsbury',
|
||
'author': 'Джоан Роулинг',
|
||
'pages': 223,
|
||
'genres': ['Фэнтези', 'Приключения'],
|
||
},
|
||
{
|
||
'title': 'Три товарища',
|
||
'description': 'История дружбы трёх молодых людей в послевоенной Германии и трагической любви.',
|
||
'year': 1936,
|
||
'publisher': 'Querido Verlag',
|
||
'author': 'Эрих Мария Ремарк',
|
||
'pages': 432,
|
||
'genres': ['Роман'],
|
||
},
|
||
{
|
||
'title': 'Шерлок Холмс. Этюд в багровых тонах',
|
||
'description': 'Первое появление великого сыщика Шерлока Холмса и его помощника доктора Ватсона.',
|
||
'year': 1887,
|
||
'publisher': 'Ward Lock & Co',
|
||
'author': 'Артур Конан Дойл',
|
||
'pages': 112,
|
||
'genres': ['Детектив'],
|
||
},
|
||
{
|
||
'title': 'Властелин колец',
|
||
'description': 'Эпическое фэнтези о хоббите Фродо, которому предстоит уничтожить Кольцо всевластья.',
|
||
'year': 1954,
|
||
'publisher': 'Allen & Unwin',
|
||
'author': 'Джон Толкин',
|
||
'pages': 1178,
|
||
'genres': ['Фэнтези', 'Приключения'],
|
||
},
|
||
{
|
||
'title': 'Краткая история времени',
|
||
'description': 'Научно-популярная книга о происхождении вселенной, чёрных дырах и природе времени.',
|
||
'year': 1988,
|
||
'publisher': 'Bantam Books',
|
||
'author': 'Стивен Хокинг',
|
||
'pages': 212,
|
||
'genres': ['Научная литература'],
|
||
},
|
||
{
|
||
'title': 'Граф Монте-Кристо',
|
||
'description': 'Приключенческий роман о моряке Эдмоне Дантесе, несправедливо заключённом в тюрьму.',
|
||
'year': 1846,
|
||
'publisher': 'Pétion',
|
||
'author': 'Александр Дюма',
|
||
'pages': 1276,
|
||
'genres': ['Приключения', 'Исторический'],
|
||
},
|
||
{
|
||
'title': 'Война и мир',
|
||
'description': 'Эпопея об эпохе наполеоновских войн глазами нескольких дворянских семей.',
|
||
'year': 1869,
|
||
'publisher': 'Русский вестник',
|
||
'author': 'Лев Толстой',
|
||
'pages': 1274,
|
||
'genres': ['Роман', 'Исторический'],
|
||
},
|
||
{
|
||
'title': 'Автостопом по галактике',
|
||
'description': 'Комедийная фантастика о землянине Артуре Денте, путешествующем по космосу.',
|
||
'year': 1979,
|
||
'publisher': 'Pan Books',
|
||
'author': 'Дуглас Адамс',
|
||
'pages': 193,
|
||
'genres': ['Фантастика'],
|
||
},
|
||
{
|
||
'title': 'Космос',
|
||
'description': 'Научно-популярная книга об астрономии, эволюции звёзд и месте человека во вселенной.',
|
||
'year': 1980,
|
||
'publisher': 'Random House',
|
||
'author': 'Карл Саган',
|
||
'pages': 365,
|
||
'genres': ['Научная литература'],
|
||
},
|
||
{
|
||
'title': 'Стивен Хокинг. Теория всего',
|
||
'description': 'Биография выдающегося физика и обзор его главных научных идей.',
|
||
'year': 2002,
|
||
'publisher': 'New Millennium Press',
|
||
'author': 'Стивен Хокинг',
|
||
'pages': 176,
|
||
'genres': ['Биография', 'Научная литература'],
|
||
},
|
||
{
|
||
'title': 'Я, Клавдий',
|
||
'description': 'Автобиографический роман от лица римского императора Клавдия об интригах двора.',
|
||
'year': 1934,
|
||
'publisher': 'Arthur Barker',
|
||
'author': 'Роберт Грейвс',
|
||
'pages': 468,
|
||
'genres': ['Биография', 'Исторический'],
|
||
},
|
||
{
|
||
'title': 'Сияние',
|
||
'description': 'Психологический хоррор о писателе Джеке Торрансе и отеле "Оверлук", сводящем с ума.',
|
||
'year': 1977,
|
||
'publisher': 'Doubleday',
|
||
'author': 'Стивен Кинг',
|
||
'pages': 447,
|
||
'genres': ['Ужасы'],
|
||
},
|
||
{
|
||
'title': 'Оно',
|
||
'description': 'История о группе детей из Дерри, противостоящих древнему злу в образе клоуна Пеннивайза.',
|
||
'year': 1986,
|
||
'publisher': 'Viking Press',
|
||
'author': 'Стивен Кинг',
|
||
'pages': 1138,
|
||
'genres': ['Ужасы'],
|
||
},
|
||
{
|
||
'title': 'Евгений Онегин',
|
||
'description': 'Роман в стихах о судьбе петербургского денди Онегина и его несостоявшейся любви к Татьяне.',
|
||
'year': 1833,
|
||
'publisher': 'Александр Смирдин',
|
||
'author': 'Александр Пушкин',
|
||
'pages': 224,
|
||
'genres': ['Поэзия', 'Роман'],
|
||
},
|
||
{
|
||
'title': 'Мёртвые души',
|
||
'description': 'Поэма в прозе о похождениях Чичикова, скупающего «мёртвые души» крепостных.',
|
||
'year': 1842,
|
||
'publisher': 'Университетская типография',
|
||
'author': 'Николай Гоголь',
|
||
'pages': 352,
|
||
'genres': ['Поэзия'],
|
||
},
|
||
]
|
||
|
||
|
||
def main():
|
||
conn = sqlite3.connect(DB)
|
||
conn.row_factory = sqlite3.Row
|
||
conn.execute('PRAGMA foreign_keys = ON')
|
||
|
||
added = 0
|
||
for book_data in BOOKS:
|
||
existing = conn.execute('SELECT id FROM books WHERE title=?', (book_data['title'],)).fetchone()
|
||
if existing:
|
||
print(f' пропуск (уже есть): {book_data["title"]}')
|
||
continue
|
||
|
||
cursor = conn.execute(
|
||
'INSERT INTO books (title, description, year, publisher, author, pages) VALUES (?,?,?,?,?,?)',
|
||
(book_data['title'], book_data['description'], book_data['year'],
|
||
book_data['publisher'], book_data['author'], book_data['pages'])
|
||
)
|
||
book_id = cursor.lastrowid
|
||
|
||
for genre_name in book_data['genres']:
|
||
genre = conn.execute('SELECT id FROM genres WHERE name=?', (genre_name,)).fetchone()
|
||
if genre:
|
||
conn.execute('INSERT OR IGNORE INTO book_genres (book_id, genre_id) VALUES (?,?)',
|
||
(book_id, genre['id']))
|
||
|
||
conn.commit()
|
||
added += 1
|
||
print(f' добавлено: {book_data["title"]}')
|
||
|
||
print(f'\nГотово. Добавлено новых книг: {added}')
|
||
|
||
print('\nКниг по жанрам:')
|
||
rows = conn.execute('''
|
||
SELECT g.name, COUNT(bg.book_id) as cnt
|
||
FROM genres g
|
||
LEFT JOIN book_genres bg ON g.id = bg.genre_id
|
||
GROUP BY g.id ORDER BY g.name
|
||
''').fetchall()
|
||
for r in rows:
|
||
print(f' {r[0]}: {r[1]}')
|
||
|
||
conn.close()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|