Программа db_explorer

Эта простой веб-сервис будет представлять собой менеджер MySQL-базы данных, который позволяет осуществлять CRUD-запросы (create, read, update, delete) к ней по HTTP

В данном задании мы продолжаем отработку навыков работы с HTTP и взаимодействуем с базой данных.

*В это задании нельзя использовать глобальные переменные, нужное вам храните в полях структуры, которая живёт в замыкании*

Для пользователя это выглядит так:
* GET / - возвращает список все таблиц (которые мы можем использовать в дальнейших запросах)
* GET /$table?limit=5&offset=7 - возвращает список из 5 записей (limit) начиная с 7-й (offset) из таблицы $table. limit по-умолчанию 5, offset 0
* GET /$table/$id - возвращает информацию о самой записи или 404
* PUT /$table - создаёт новую запись, данный по записи в теле запроса (POST-параметры)
* POST /$table/$id - обновляет запись, данные приходят в теле запроса (POST-параметры)
* DELETE /$table/$id - удаляет запись
* GET, PUT, POST, DELETE - это http-метод, которым был отправлен запрос

Особенности работы программы:
* Роутинг запросов - руками, никаких внешних библиотек использовать нельзя.
* Полная динамика. при инициализации в NewDbExplorer считываем из базы список таблиц, полей (запросы ниже), далее работаем с ними при валидации. Никакого хадкода в виде кучи условий и написанного кода для валидации-заполнения. Если добавить третью таблицу - всё должно работать для неё.
* Считаем что во время работы программы список таблиц не меняется
* Запросы придётся конструировать динамически, данные оттуда доставать тоже динамически - у вас нет фиксированного списка параметров - вы его подгружаете при инициализации.
* Валидация на уровне "string - int - float - null", без заморочек. Помните, что json в пустой итнерфейс распаковывает как float, если не указаны спец. опции.
* Вся работа происходит через database/sql, вам на вход передаётся рабочее подключение к базе. Никаких orm и прочего.
* Все имена полей так как они в базе.
* В случае если возникает ошибка - просто возвращаем 500 в http-статусе
* Не забывайте про SQL-инъекции
Неизвестные поля игнорируем
* В этом задании запрещено использование глобальных переменных. Всё что вы хотите хранить - храните в полях структуры, которая живёт в замыкании

Запросы вам в помощь для получения списка таблицы и их структуры:
``
SHOW TABLES;
SHOW FULL COLUMNS FROM `$table_name`;
``

Подсказки:
* Внутри row, который вы получаете из базы лежат не только сами значения полей, но и метаданные - https://golang.org/pkg/database/sql/#Rows.ColumnTypes
* Тут будут активно применяться пустые интерфейсы
* Обратите внимание на обработку null-значения ( это когда вам не приходит значение переменной, для которой нет дефолта в базе - там буде такой тест-кейс)
* Придётся вытаскивать неизвестное количество полей из row, подумайте как тут можно применить пустые интерфейсы
* Поднять mysql-базу локально проще всего через докер:
```
docker run -p 3306:3306 -v $(PWD):/docker-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=golang -d mysql
```