РС
June 19, 2020, 2:01 a.m.

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

qt, DataBase, QML

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

2

Do you like it? Share on social networks!

19
Evgenii Legotckoi
  • June 19, 2020, 2:18 a.m.

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

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

  1. query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');")
    РС
    • June 19, 2020, 2:38 a.m.

    "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
      • June 19, 2020, 2:41 a.m.

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

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

        Evgenii Legotckoi
        • June 19, 2020, 2:49 a.m.
        • (edited)

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

          1. bool DataBase::inserIntoTable(const QVariantList &data)
          2. {
          3.  
          4. QSqlQuery query;
          5.  
          6. query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');");
          7.  
          8. if(!query.exec()){
          9. qDebug() << "error insert into " << TABLE;
          10. qDebug() << query.lastQuery();
          11. qDebug() << query.lastError().text();
          12. return false;
          13. } else {
          14. return true;
          15. }
          16. return false;
          17. }
            Evgenii Legotckoi
            • June 19, 2020, 2:54 a.m.

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

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

            1. "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
                • June 19, 2020, 3:02 a.m.

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

                1. QSqlQuery query;
                2. query.prepare("INSERT INTO person (id, forename, surname) "
                3. "VALUES (:id, :forename, :surname)");
                4. query.bindValue(":id", 1001);
                5. query.bindValue(":forename", "Bart");
                6. query.bindValue(":surname", "Simpson");
                7. query.exec();

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

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

                1. bool DataBase::inserIntoTable(const QVariantList &data)
                2. {
                3.  
                4. QSqlQuery query;
                5.  
                6. query.prepare("INSERT INTO public.NameTable (FirstName, SurName, Nik) VALUES (:db, 'cc', 'bb');");
                7. query.bindValue(":db", data[0].toString());
                8.  
                9. if(!query.exec()){
                10. qDebug() << "error insert into " << TABLE;
                11. qDebug() << query.lastQuery();
                12. qDebug() << query.lastError().text();
                13. return false;
                14. } else {
                15. return true;
                16. }
                17. return false;
                18. }

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

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

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

                    1. bool DataBase::inserIntoTable(const QVariantList &data)
                    2. {
                    3.  
                    4. QSqlQuery query;
                    5.  
                    6. query.prepare("INSERT INTO NameTable (FirstName, SurName, Nik) VALUES (:FName, :SName, :Nik)");
                    7. query.bindValue(":FName", "Name");
                    8. query.bindValue(":SName", "Surname");
                    9. query.bindValue(":Nik", "Nik");
                    10.  
                    11. if(!query.exec()){
                    12. qDebug() << "error insert into " << TABLE;
                    13. qDebug() << query.lastQuery();
                    14. qDebug() << query.lastError().text();
                    15. return false;
                    16. } else {
                    17. return true;
                    18. }
                    19. return false;
                    20. }

                      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
                        • June 19, 2020, 3:30 a.m.

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

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

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

                            Evgenii Legotckoi
                            • June 19, 2020, 3:38 a.m.

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

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

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

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

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

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

                                Evgenii Legotckoi
                                • June 19, 2020, 4:10 a.m.

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

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

                                    РС
                                    • June 19, 2020, 6:15 a.m.
                                    • The answer was marked as a solution.

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

                                      Comments

                                      Only authorized users can post comments.
                                      Please, Log in or Sign up
                                      • Last comments
                                      • AK
                                        April 1, 2025, 11:41 a.m.
                                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                      • Evgenii Legotckoi
                                        March 9, 2025, 9:02 p.m.
                                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                      • VP
                                        March 9, 2025, 4:14 p.m.
                                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                      • ИМ
                                        Nov. 22, 2024, 9:51 p.m.
                                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                      • Evgenii Legotckoi
                                        Oct. 31, 2024, 11:37 p.m.
                                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup