Skip to content

dev-danrogulin/SQL-engine-in-console

Repository files navigation

MiniSQL (Учебный C++ проект)

English version

Мини-проект, который имитирует простую работу с таблицами в памяти: создание таблицы, вставка строк, фильтрация и вывод в консоль.

1) Для чего этот проект

Проект нужен как учебная практика по C++ и базовым идеям СУБД:

  • как хранить табличные данные в памяти;
  • как разделять код на классы и модули;
  • как проверять типы данных при вставке;
  • как делать простые запросы (фильтр по условию).

2) Зачем он нужен

Этот проект помогает закрепить:

  • class, public/private, инкапсуляцию;
  • работу с контейнерами STL (std::vector, std::unordered_map);
  • работу с типами через std::variant (int или std::string);
  • обработку ошибок через исключения (std::runtime_error);
  • разделение интерфейса (.h) и реализации (.cpp).

Идея: сначала понять логику "маленькой базы данных", а потом уже переходить к SQL/реальным СУБД.

3) Что делает

Проект реализует следующий сценарий:

  1. Создает таблицу users с колонками:
    • id (Int)
    • name (Text)
    • age (Int)
  2. Добавляет несколько строк (пользователей).
  3. Печатает все строки таблицы.
  4. Фильтрует строки по условию (age > 18).
  5. Печатает результат фильтрации.

Основные возможности

  • создание таблиц в Database по имени;
  • проверка существования таблицы;
  • получение таблицы по имени;
  • вставка строк в Table с валидацией:
    • совпадение количества значений и колонок;
    • совпадение типов значений и типа колонки;
  • фильтрация строк по колонке и операции сравнения:
    • Equal, Greater, Less;
  • вывод таблицы в консоль.

4) Как реализовано

Архитектура по файлам

  • Value.h
    Описывает типы данных:

    • DataType (Int, Text)
    • Value = std::variant<int, std::string>
    • Column (имя + тип)
  • Row.h
    Одна строка таблицы: std::vector<Value> values.

  • Table.h / Table.cpp
    Класс таблицы:

    • хранит имя таблицы, список колонок и строки;
    • insert вставляет строку с проверкой структуры и типов;
    • getColumnIndex ищет индекс колонки по имени.
  • Database.h / Database.cpp
    Контейнер таблиц:

    • хранение через std::unordered_map<std::string, Table>;
    • createTable, getTable, hasTable.
  • Filter.h / Filter.cpp
    Логика выборки:

    • Condition (колонка + операция + значение);
    • filterRows возвращает строки, подходящие под условие.
  • Printer.h / Printer.cpp
    Вывод таблицы и значений в консоль.

  • main.cpp
    Демонстрация полного сценария работы.

Важные идеи в коде

  • Инкапсуляция: внутренние структуры (tables_, rows_) скрыты в private, доступ через методы.
  • Ссылки: getTable возвращает ссылку на существующую таблицу внутри базы.
  • Константность: const-перегрузки дают безопасный доступ "только чтение".
  • Типобезопасность: std::variant + std::holds_alternative/std::get.
  • Fail-fast: при ошибках бросаются исключения с понятным сообщением.

Сборка и запуск

Вариант 1: g++

g++ -std=c++17 -Wall -Wextra -pedantic main.cpp Table.cpp Database.cpp Filter.cpp Printer.cpp -o minisql
./minisql

Вариант 2: CMake

cmake -S . -B build
cmake --build build

Пример результата

В консоли выводится:

  • полная таблица users;
  • затем таблица строк, где age > 18.

About

Mini-SQL engine in console

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors