Юрий
Юрий17 августа 2019 г. 22:54

Как правильно отслеживать актуальность базы данных

database

Добрый вечер.

Подскажите как правильно синхронизировать структуру БД? С другим рабочем местом.
БД MySQL.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

13
Ruslan Polupan
  • 17 августа 2019 г. 23:53

Не очень понятен вопрос. База одна или их несколько?

    Юрий
    • 18 августа 2019 г. 1:06

    База одна.
    Как отслеживать структуру в самой БД и той которая в приложении.
    Обратился я к таблице, а ее нет в данной версии БД и приложение упало.

      Юрий
      • 18 августа 2019 г. 1:11

      Сейчас я использую MySQL Workbench, создаю EER model и потом синхронизирую структуру БД где мне нужно, но вот хотелось бы автоматом проверять совместимость БД с приложением.
      Надеюсь правильно изложил мысль.

        Ruslan Polupan
        • 18 августа 2019 г. 13:22

        Т.е. таблицы в БД к которым обращается приложение могут отсутсвовать?

          Юрий
          • 18 августа 2019 г. 14:53

          Все верно.

            nayk1982
            • 19 августа 2019 г. 10:40
            • (ред.)

            Программно можно проверить существование таблицы, получить список таблиц БД, получить список полей конкретной таблицы и т.д. Это все на совести программиста и если структура БД может меняться, то такие проверки необходимо делать до обращения к таблицам, чтоб приложение не падало.

            Список таблиц в Qt: QSqlDatabase::tables(...)

              Evgenii Legotckoi
              • 19 августа 2019 г. 12:57

              У нас в проекте создана таблица, в которой вносятся версии базы данных, в зависимости от версии используется соответствующая логика.

              В случае с Django, например, имеется таблица миграций, и каждая запись соответствует миграционному файлу. Автоматически делается проверка на структуру базы данных, и если есть изменения, то нужно применить новые миграции.

              Ещё как вариант, то дополнительно прикрутить REST API к серверу базы данных и отдавать данные в виде JSON структур. Их будет проще распрасить, чтобы приложение не падало.

                Pavel K.
                • 19 августа 2019 г. 19:47
                bool YourClass::chekIfEmpty(const QString& table) {   
                    return getCount(table) == 0;
                }
                int YourClass::getCount(const QString& table, const QString& where) {    
                    QString command = QString("SELECT COUNT(*) FROM '%1'").arg(table);
                    if (!where.isEmpty()) {
                        command += " WHERE " + where;
                    }
                    execute(command);
                    int count = 0;
                    if (query().next()) {
                        count = query().value(0).toInt();
                    }
                
                    return count;
                }
                

                думаю что-то подобное)))

                  Юрий
                  • 21 августа 2019 г. 12:46

                  Тут только получим сами таблицы, а колонки и тип данных. Таблицы не так часто меняются, а вот тип данных и колонки очень даже часто.

                    Evgenii Legotckoi
                    • 21 августа 2019 г. 13:04

                    Вам нужно вести версионирование базы данных и в зависимости от версии использовать соответсвующую логику. Иначе никак. У нас на проекте тоже имеется проблема с версионированием в базе данных. Просто создали таблицу, которая содержит версию, и в зависимости от версии либо конвертируем поля, либо ничего не делаем, то есть игнорируем логику, либо делаем ещё что-то, что требуется.

                    То есть однозначно нужна таблица с версией базы данных.

                    Естественно, что это хорошо работает в том случае, если приложение последней версии открывает базу данных старшей версии или той же самой.

                    Старое приложение откроет новую базу данных скорее всего с ошибками. Либо после проверки предлагать обновление и ничего не делать.

                      Ruslan Polupan
                      • 21 августа 2019 г. 13:11

                      У нас реализовано так что при запуске программа проверяет версию БД (естетсвенно она хранится в таблице) если версия БД младше то выполняется обновление бд. На каждую новую версию если изменяется структура БД создается sql файл со скриптами которые и зменяют БД 20190806_update_tanks.sql например. И программа последовательно выполняет скрипты для модификации БД и только потом запускается.

                        nayk1982
                        • 21 августа 2019 г. 13:16

                        Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант:
                        1. Получить список таблиц через QSqlDatabase::tables
                        2. Для каждой таблицы получить список столбцов, например так:

                        QSqlQuery query();
                        if(query.exec("select * from tableName limit 1;")) {
                          QSqlRecord rec = query.record();
                          for(int j=0; j<rec.count(); j++) {
                            // Тут доступ к полю, его имя, тип и т.д:
                            // rec.field(j).name();
                            // rec.field(j).type();
                            // etc..
                          }
                        }
                        

                        Но вариант Евгения правильнее и логичнее если ПО делается под конкретную БД.

                          Юрий
                          • 25 августа 2019 г. 22:25

                          В принципе я так и делаю, у меня есть таблица с номером текущей версии БД.
                          При запуске приложения происходит проверка версии БД поддерживаемой приложением.
                          Потом получаю данные в Json формате с сайта и проверяю на новые версии.
                          Если вышла новая версия, предлагаю обновиться и запускаю стандартный интерфейс (QtIFW) обновления из репозитория.

                          Спасибо, расказали подробно.

                            Комментарии

                            Только авторизованные пользователи могут публиковать комментарии.
                            Пожалуйста, авторизуйтесь или зарегистрируйтесь
                            Ua

                            Qt - Тест 001. Сигналы и слоты

                            • Результат:84баллов,
                            • Очки рейтинга4
                            Ua

                            Qt - Тест 001. Сигналы и слоты

                            • Результат:42баллов,
                            • Очки рейтинга-8
                            ОК

                            Qt - Тест 001. Сигналы и слоты

                            • Результат:47баллов,
                            • Очки рейтинга-6
                            Последние комментарии
                            ИМ
                            Игорь Максимов22 ноября 2024 г. 21:51
                            Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            Evgenii Legotckoi
                            Evgenii Legotckoi31 октября 2024 г. 23:37
                            Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                            A
                            ALO1ZE19 октября 2024 г. 17:19
                            Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                            ИМ
                            Игорь Максимов5 октября 2024 г. 16:51
                            Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                            d
                            dblas55 июля 2024 г. 20:02
                            QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            Сейчас обсуждают на форуме
                            f
                            firstlunoxod15 февраля 2025 г. 13:46
                            Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                            Дмитрий
                            Дмитрий3 февраля 2025 г. 16:24
                            Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                            NW
                            Nayo Wai30 января 2025 г. 19:22
                            не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                            n
                            nkly3 января 2025 г. 12:52
                            Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                            M
                            Marsel17 августа 2023 г. 0:26
                            OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                            Следите за нами в социальных сетях