PostgreSQL, Qt

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Здесь: Qt: Резервная копия pg_dump БД PostgreSQL в Windows я показала один из способов организации создания резервной копии базы данных.

Сейчас речь пойдет о восстановлении базы из бэкапа. Здесь тоже будем использовать пакетный файл для вызова pg_restore.

Про каталог bin, файл паролей pgpass написано в статье по ссылке выше.

//name - имя базы данных
//file - файл резервной копии
void myClass::restoreDatabase(QString name, QString file)
{
    QString errorMsg;
    QString connectionName = connectToDB(name, errorMsg);
    if (connectionName.isEmpty()){
        error(errorMsg);
        return;
    }
    QString binDir = postgresBinDirectory();
    if (binDir.isEmpty()) {
        error(tr("Системный каталог bin сервера не найден. Операция "
                 "восстановления базы данных %1 из резервной копии %2 прервана")
              .arg(name).arg(file));
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlQuery query(QSqlDatabase::database(connectionName));
	//сначала удаляем схему (у меня паблик), 
	//затем ее снова создаем - чистенькую
    if (!query.exec(QString("DROP SCHEMA public cascade;  "
                            "CREATE SCHEMA public "
                            "AUTHORIZATION postgres; "
                            "COMMENT ON SCHEMA public "
                            "IS 'standard public schema'; "
                            "GRANT ALL ON SCHEMA public TO PUBLIC; "
                            "GRANT ALL ON SCHEMA public TO %1;")
                    .arg(postgresUser))) {
        error(tr("Ошибка удаления схемы базы данных %1: %2")
              .arg(name).arg(query.lastError().text()));
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlDatabase::removeDatabase(connectionName);
	//текст batch-файла
    QString batText = QString("@ECHO OFF \n"
                              "SET dmpfile=%1 \n"
                              "set text = Begin to restore...  \n"
                              "echo %text% \n"
                              "cd /d %2 \n"
                              "pg_restore --host=%4 --port=%5 "
                              "--username=%6 --verbose -d "
                              " %3 \"%dmpfile%\"\n"
                              "set /p id=\"The process is finished successfully. "
                              "Press Enter to exit...\"")
            .arg(file, binDir, name,
                 host, ui->port->text(), postgresUser);
    QString fileName = QString("%1-restore.bat")
            .arg(name);
    if (!writeBatFile(batText, fileName, 
					  QCoreApplication::applicationDirPath()+"/temp"))
        return;
	//обновляем файл паролей, если нужно
    updatePgPassFile(QString("%1:%2:%3:%4:%5")
                     .arg(host,
                          ui->port->text(),
                          name,
                          postgresUser,
                          ui->password->text()));
	//вызываем пакетный файл для выполнения восстановления базы данных
    system(qPrintable("cmd.exe /c \""+
                      QDir::toNativeSeparators(
                          QString("%1/%2")
                          .arg(QCoreApplication::applicationDirPath()+"/temp")
                          .arg(fileName)+"\"")));
}

 

SQL, Базы данных

Основы баз данных. Логическая модель. 3 основные нормальные формы

Нормальные формы базы данныхВ статье Основы баз данных. ER-модель (сущность-связь) я рассказала про принцип построения этой самой модели. Это — отправная точка в создании базы данных. От модели сущность-связь необходимо перейти к логической модели — к тому виду, в котором и будет представлена наша база данных (не учитывая физическую модель) в выбранной системе управления базами данных (СУБД). Продолжить чтение «Основы баз данных. Логическая модель. 3 основные нормальные формы»

SQL, Базы данных, О том о сём

Основы баз данных. ER-модель (сущность-связь)

ER model заголовок статьиПару лет назад среди прочих моих занятий были онлайн уроки по основам построения логической структуры базы данных и языку SQL. Уроками на данный момент не занимаюсь, а вот сами записи остались, так что решила я их выложить, чего добру пропадать зря? 🙂

Сегодня речь пойдет о модели «сущность-связь», или entity-relationship model. Продолжить чтение «Основы баз данных. ER-модель (сущность-связь)»

Qt, Базы данных

Подключение к базе данных в Qt

Для подключения к базе данных нам необходимо включить в проект следующие классы:

#include <QMessageBox> //для вывода сообщения пользователю
#include <QSqlDatabase>
#include <QSqlError>
QMessageBox позволит вывести информацию о статусе подключения к базе данных, QSqlDatabase позволит совершить это подключение, а без QSqlError мы не сможем узнать, какая ошибка возникла при неудачном подключении к базе.
Необходимо также в тексте файла проекта (*.pro) указать следующее:

QT += sql

/*QPSQL - название драйвера для подключения к той или иной СУБД, в данном случае - к PostgreSQL; для подключения к базе MS SQL Server вам необходимо сначала настроить источник данных ODBC*/

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");  /*после наименование драйвера БД также можно указать произвольное наименование подключения к серверу БД: addDatabase("QPSQL", "myConnection1")
имя или адрес сервера, где находится СУБД*/
db.setHostName("localhost");
//имя базы данных
db.setDatabaseName("myDB");
//имя пользователя
db.setUserName("user1");
//его пароль
db.setPassword("123321");
/*открываем подключение; если неудачно - выводим сообщение об ошибке*/
if (!db.open())
QMessageBox::critical(NULL,QObject::tr("Ошибка"),db.lastError().text());

При попытке подключения к базе данных PostgreSQL можно получить сообщение об ошибке «Driver not loaded». Это значит, что ваша система не может найти драйвер PostgreSQL. Необходимо в системный путь (PATH) вписать пути к папкам lib и bin вашей версии СУБД.

При удачном подключении к базе данных все обращения к базе в вашем проекте будут автоматически распознавать это подключение. Если подключение было задано без наименования подключения, то оно будет расцениваться как подключение по умолчанию. В проекте обязательно должно быть такое подключение, иначе получим ошибку. Работая с потоками в проекте для каждого потока должно быть свое подключение под своим именем.

Подключение к базе данных Microsoft SQL Server в Qt.

Инфо обо мне: https://secretsilent.ru/info/