РС
Руслан Склюев19 июня 2020 г. 2:01

Простенький запрос

qt, DataBase, QML

Здравствуйте! Установил PG12.
Тестовый запрос: INSERT INTO "public"."NameTable" ("FirstName", "SurName", "Nik") VALUES ('ff', 'cc', 'bb');
Как реализовать его в query.prepare? ругается на кавычки.

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

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

19
Evgenii Legotckoi
  • 19 июня 2020 г. 2:18

Добрый день.
Нужно делать экранирование, поскольку кавычки в C++ это спец символы.

Напишите строку так

query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');")
    РС
    • 19 июня 2020 г. 2:38

    "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
    "ОШИБКА: ошибка синтаксиса в конце\nLINE 1: EXECUTE \n ^\n(42601) QPSQL: Невозможно создать запрос"
    QML debugging is enabled. Only use this in a safe environment.

      Evgenii Legotckoi
      • 19 июня 2020 г. 2:41

      Показывайте полный код, как формируете запрос, в том числе и C++ код.

      P/S/ и когда будете вставлять в сообщение код, то воспользуйтесь диалогом для вставки кода, чтобы разметка правильно сформировалась.
      Это одна из кнопок в тулбаре редактора.

        Evgenii Legotckoi
        • 19 июня 2020 г. 2:49
        • (ред.)

        Будьте так любезны, вставляйте программный код с помощью этого дилога.
        У меня нет времени, чтобы перепечатывать ваш код с картинки, чтобы объяснить вам вашу ошибку.

          bool DataBase::inserIntoTable(const QVariantList &data)
          {
          
              QSqlQuery query;
          
             query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');");
          
              if(!query.exec()){
                  qDebug() << "error insert into " << TABLE;
                  qDebug() <<  query.lastQuery();
                  qDebug() << query.lastError().text();
                  return false;
              } else {
                  return true;
              }
              return false;
          }
          
            Evgenii Legotckoi
            • 19 июня 2020 г. 2:54

            Какую ошибку выдаёт этот ваш запрос?
            Поскольку в предыдущем сообщении у вас был запрос, в котором вы пытались сделать bind

            и выглядел он иначе

            "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
            

              "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
              "ОШИБКА: ошибка синтаксиса в конце\nLINE 1: EXECUTE \n ^\n(42601) QPSQL: Невозможно создать запрос"
              QML debugging is enabled. Only use this in a safe environment.

                Evgenii Legotckoi
                • 19 июня 2020 г. 3:02

                Вот пример из документации

                QSqlQuery query;
                query.prepare("INSERT INTO person (id, forename, surname) "
                              "VALUES (:id, :forename, :surname)");
                query.bindValue(":id", 1001);
                query.bindValue(":forename", "Bart");
                query.bindValue(":surname", "Simpson");
                query.exec();
                

                Если вы пытаетесь сделать bind, то вам нужно правильно сформировать строку запроса, плюс указать bind привязки.

                В данном случае наличие кавычек уже не нужно будет.

                bool DataBase::inserIntoTable(const QVariantList &data)
                {
                
                    QSqlQuery query;
                
                   query.prepare("INSERT INTO public.NameTable (FirstName, SurName, Nik) VALUES (:db, 'cc', 'bb');");
                   query.bindValue(":db",       data[0].toString());
                
                    if(!query.exec()){
                        qDebug() << "error insert into " << TABLE;
                        qDebug() <<  query.lastQuery();
                        qDebug() << query.lastError().text();
                        return false;
                    } else {
                        return true;
                    }
                    return false;
                }
                

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

                  error insert into  NameTable
                  "INSERT INTO public.NameTable (FirstName, SurName, Nik) VALUES ('ffb', 'cc', 'bb');"
                  "ОШИБКА:  ошибка синтаксиса в конце\nLINE 1: EXECUTE \n                ^\n(42601) QPSQL: Невозможно создать запрос"
                  
                    Evgenii Legotckoi
                    • 19 июня 2020 г. 3:20

                    Так, добро... А как себя поведёт такой код?

                    bool DataBase::inserIntoTable(const QVariantList &data)
                    {
                    
                        QSqlQuery query;
                    
                        query.prepare("INSERT INTO NameTable (FirstName, SurName, Nik) VALUES (:FName, :SName, :Nik)");
                        query.bindValue(":FName",       "Name");
                        query.bindValue(":SName",       "Surname");
                        query.bindValue(":Nik",         "Nik");
                    
                        if(!query.exec()){
                            qDebug() << "error insert into " << TABLE;
                            qDebug() <<  query.lastQuery();
                            qDebug() << query.lastError().text();
                            return false;
                        } else {
                            return true;
                        }
                        return false;
                    }
                    

                      error insert into public.NameTable
                      "INSERT INTO NameTable (FirstName, SurName, Nik) VALUES (:FName, :SName, :Nik)"
                      "ОШИБКА: ошибка синтаксиса (примерное положение: \"(\")\nLINE 1: EXECUTE ('Name', 'Surname', 'Nik')\n ^\n(42601) QPSQL: Невозможно создать запрос"

                      Ну теперь на значения ругается

                        Evgenii Legotckoi
                        • 19 июня 2020 г. 3:30

                        А это уже очень плохо. Данный вариант кода должен был сработать.
                        Или не создалась таблица, или драйвер QPSQL коряво отрабатывает с PG12.

                        Лучше будет, если таблицы нет.
                        В случае с драйвером писать на багтрекер Qt Company тикет об ошибке и откатываться на более старую версию PG

                          На PG запрос должен выглядеть так INSERT INTO "public"."NameTable" ("FirstName", "SurName", "Nik") VALUES ('ff', 'cc', 'bb')

                            Evgenii Legotckoi
                            • 19 июня 2020 г. 3:38

                            Тогда это должно было сработать - ссылка на комментарий

                            Также наличие public не принципиально, как и наличие кавычек

                            Сами документацию на PostgreSQL 12 почитайте, вот ссылка на INSERT

                            А вот пример из документации

                            INSERT INTO films (code, title, did, date_prod, kind)
                                VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
                            

                              У меня получилось, если создать строку, потом как вы написали, потом как тут - https://doc.qt.io/qt-5/qstring.html#initializing-a-string перебрать строку и заменить слэши на пробелы. Но это костыль?

                                Evgenii Legotckoi
                                • 19 июня 2020 г. 4:10

                                Сдаётся мне, что у вас кодировка файла исходных кодов корявая.
                                Другой причины уже быть не может, иначе вам не пришлось бы заменять слэши. Дело в том, что слэш экранирует в код на C++ кавычки, чтобы это скомпилировалось нормально в строку.

                                  А как ее сменить?

                                    РС
                                    • 19 июня 2020 г. 6:15
                                    • Ответ был помечен как решение.

                                    Пересоздал таблицу в базе - все заработало без кавычек и public. Большое спасибо!

                                      Комментарии

                                      Только авторизованные пользователи могут публиковать комментарии.
                                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                      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 Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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