У цій статті ми поглибимося в процес створення та вставки великих обсягів даних у базу даних SQLite. Чи то ви створюєте backend-проект, тестуєте продуктивність додатку, чи просто вдосконалюєте свої навички роботи з базами даних, цей посібник допоможе вам ефективно заповнити базу даних реалістичними наборами даних. Ми проведемо вас через налаштування бази даних та використання потужного інструменту для автоматизації вставки даних, що дозволить вам легко масштабувати ваш проект. Почнемо!
Крок 1: Клонування репозиторію
Перед тим як продовжити, потрібно клонувати мій репозиторій на ваш локальний комп’ютер. Виконайте ці кроки:
- Перейдіть за наступним посиланням, щоб отримати доступ до репозиторію: [Ваш URL репозиторію].
- Переконайтеся, що у вас встановлений Git на вашій системі. Якщо ще не встановили, ви можете завантажити його з тут.
- Відкрийте термінал (або Git Bash) і перейдіть до директорії, де ви хочете зберігати репозиторій.
- Виконайте наступну команду для клонування репозиторію:
git clone [Ваш URL репозиторію]
- Після клонування репозиторію, перейдіть у папку проекту, виконуючи команду:
cd [Назва папки репозиторію]
Цими кроками ви успішно клонували репозиторій на ваш локальний комп’ютер і готові продовжити з іншими налаштуваннями або інструкціями в статті!
Крок 2: Скопіюйте папку data
і файл data_generator.py
у корінь вашого проекту
Після того як ви клонували репозиторій, наступним кроком буде копіювання двох важливих файлів/папок у кореневу директорію вашого проекту.
- У репозиторії знайдіть папку
data
та файлdata_generator.py
. - Скопіюйте папку
data
та файлdata_generator.py
. - Вставте їх безпосередньо в корінь вашого проекту. Це повинна бути та сама директорія, де знаходяться основні файли вашого проекту.
Зробивши це, ви забезпечите доступ вашого проекту до необхідних даних і скриптів для їх генерації або обробки.
Крок 3: Скопіюйте вміст models.py
у ваш проектний файл models.py
Наступним кроком потрібно переконатися, що ваш проект налаштований із правильними моделями бази даних.
- Відкрийте файл
models.py
з репозиторію. - Скопіюйте весь вміст цього файлу.
- Вставте вміст у файл
models.py
в кореневій директорії вашого проекту. Якщо ваш проект ще не має файлуmodels.py
, створіть новий і вставте вміст туди.
Альтернативно, якщо ви вирішите не копіювати вміст безпосередньо, ви можете створити свою власну базу даних SQLite на основі моделей, наданих у моєму файлі models.py
. Переконайтеся, що моделі відповідають структурі, визначеній в оригінальному файлі для сумісності.
Завершивши цей крок, ви забезпечите ваш проект правильною схемою бази даних.
Пояснення коду
Наступний Python-скрипт призначений для генерації великого обсягу фейкових даних і вставки їх у базу даних, симулюючи набір даних, пов’язаний з фільмами. Це може бути корисно для тестування або роботи з великими даними в середовищі бази даних.
1. Імпортування необхідних бібліотек
Скрипт імпортує кілька бібліотек для виконання таких завдань, як зчитування файлів, підключення до бази даних та генерація випадкових даних:
import itertools
import datetime
import json
import numpy as np
import sqlite3
import random
itertools
: Для генерації комбінацій імен, слів, фільмів тощо.datetime
: Для обробки функцій, пов’язаних з датами, наприклад, обчислення років.json
: Для парсингу JSON-даних (наприклад, жанрів).numpy
: Для числових операцій, зокрема для створення діапазону рейтингів.sqlite3
: Для взаємодії з базою даних SQLite.random
: Для генерації випадкових даних для кожного фільму, актора та режисера.
2.
Завантаження файлів з даними**
Скрипт читає різноманітні зовнішні текстові файли для генерації випадкових даних:
with open("data/names/first-names.txt", "r") as f1:
names_file = f1.read()
names = names_file.split()
Тут скрипт читає файл first-names.txt
, який містить список імен, і зберігає їх у список під назвою names
. Те саме він робить для прізвищ.
with open("data/names/first-names.txt", "r") as f2:
families_file = f2.read()
families = families_file.split()
Аналогічно, він завантажує інші файли, такі як countries.txt
, genres.json
, movie_list.txt
і wiki-100k.txt
, для різних даних, необхідних для симуляції. Ці файли надають інформацію про країни, жанри, фільми та випадкові слова, які використовуються для описів.
3. Генерація комбінацій та вибірок
Скрипт генерує комбінації імен та прізвищ, які пізніше будуть використані для випадкового призначення акторів та режисерів.
names_families_combo = list(itertools.product(names, families))
Також підготовлюється список комбінацій фільмів, випадково поєднуючи назви фільмів.
movies_combo = list(itertools.combinations(movies_choices, 2))
movies = [movie[0] + " " + movie[1] for movie in movies_combo]
Опис фільмів генерується шляхом комбінування випадкових слів зі списку:
descriptions_1 = [word[0] + " " + word[1] + " " + word[2] + " " + word[3] for word in words_1]
Ці описи будуть використані для створення випадкових описів фільмів.
4. Підключення до бази даних
Скрипт підключається до бази даних SQLite (db.sqlite3
) та налаштовує курсор для виконання SQL-команд:
cnn = sqlite3.connect("db.sqlite3")
cur = cnn.cursor()
5. Вставка даних у базу даних
Основна частина цього скрипту — це вставка випадкових даних у різні таблиці бази даних. Ось як він обробляє дані:
- Актори: Генерується 10 000 випадкових акторів, поєднуючи імена, прізвища та роки народження. Кожен актор вставляється у таблицю
actors
:
a = f"INSERT INTO actors (`firstname`, `lastname`, `born_year`) VALUES ('{actor_name.replace("'" , "")}', '{actor_family.replace("'" , "")}', '{actor_born}')"
- Режисери: Аналогічно до акторів, генерується 10 000 режисерів, які випадковим чином вставляються в таблицю
directors
.
b = f"INSERT INTO directors (`firstname`, `lastname`, `born_year`) VALUES ('{director_name.replace("'" , "")}', '{director_family.replace("'" , "")}', '{director_born}')"
- Країни: Кожна країна з файлу
countries.txt
вставляється в таблицюcountries
.
a = f"INSERT INTO countries (`name`) VALUES ('{country.replace("'" , "")}')"
- Жанри: Всі жанри з файлу
genres.json
вставляються в таблицюgenres
.
a = f"INSERT INTO genres (`title`) VALUES ('{genre.replace("'" , "")}')"
- Фільми: Створюється 1 000 пар фільмів (комбінацій назв фільмів) і вставляються в таблицю
movies
. Кожен фільм асоціюється з випадковим описом, роком та рейтингом.
a = f"INSERT INTO movies (`title`, `description`, `year`, `rating`) VALUES ('{movie.replace("'" , "")}', '{description.replace("'" , "")}', '{year}', '{rating}')"
6.
Пов'язування даних**
Після вставки фільмів, скрипт створює зв'язки між фільмами та акторами, режисерами, жанрами та країнами.
- Фільми та актори: Кожен фільм випадковим чином асоціюється з 5 до 15 акторами.
a = f"INSERT INTO movies_actors (`movie_id`, `actor_id`) VALUES ('{i}', '{actr}')"
- Фільми та режисери: Кожен фільм випадковим чином асоціюється з 2 до 5 режисерами.
a = f"INSERT INTO movies_directors (`movie_id`, `director_id`) VALUES ('{i}', '{drct}')"
- Фільми та жанри: Кожному фільму випадковим чином призначаються 3 до 5 жанрів.
a = f"INSERT INTO movies_genres (`movie_id`, `genre_id`) VALUES ('{i}', '{gnr}')"
- Фільми та країни: Кожен фільм випадковим чином асоціюється з 5 до 10 країнами, а також випадковими даними про продажі.
a = f"INSERT INTO sales (`amount`, `country_id`, `movie_id`) VALUES ({amount}, '{cntr}', '{i}')"
7. Фіксація даних у базі даних
Кожну команду вставки виконується за допомогою команди cur.execute(a)
, а зміни фіксуються в базі даних за допомогою cnn.commit()
. Це забезпечує збереження даних у базі даних після кожної вставки.
Висновок
Цей скрипт є ефективним способом створення великої бази даних фільмів, заповненої випадковими, але реалістичними даними, імітуючи середовище великої кількості даних. Вставляючи тисячі записів у кілька таблиць (наприклад, актори, режисери, фільми, жанри), він надає всеосяжний набір даних для роботи. Це особливо корисно для тестування продуктивності бази даних, застосувань машинного навчання та аналізу великих даних.
Перекладено з: Generate and Insert Massive Data into SQLite Databases with Ease