psycopg2.Ошибка программирования: не удается адаптировать тип ‘QDate’ pyqt sql

#python #sql #postgresql #pyqt5

#python #sql #postgresql #pyqt5

Вопрос:

я использую приложение pyqt gui для извлечения истории из моей базы данных с помощью функции folowing

 def historique_jr_date(self):
        database = QSqlDatabase("QPSQL")
        database.setHostName("localhost")
        database.setDatabaseName("database")
        database.setUserName("postgres")
        database.setPassword("password")
        database.open()
        
        model_hjd = QSqlTableModel(db=database)
        model_hjd.setTable('transactions')
        
        model_hjd.setEditStrategy(QSqlTableModel.OnManualSubmit)
        
        date = str(self.dateEdit_2.text())
        selected_day = self.dateEdit_2.date()
        last_day = selected_day.addDays(-1)
        last_day_str = last_day.toString(self.dateEdit_2.displayFormat())
        print(last_day_str)
        
        self.tableView_3.setModel(model_hjd)
        self.tableView_3.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        #idx = model_ft.fieldIndex("max(id)")
        model_hjd.setSort(7, Qt.DescendingOrder)
        model_hjd.select()
        filter_ft = "(date_d, time_d) > ('%s'::date, '16:00:00'::time) AND (date_d, time_d) < ('%s'::date, '16:00:00'::time) " % (selected_day, last_day)
        model_hjd.setFilter(filter_ft)

        self.connection = psycopg2.connect(user="postgres",
                               password="password",
                               host="localhost",
                               database="database")
        self.cur = self.connection.cursor()

        self.cur.execute( '''SELECT SUM(montant) AS total FROM transactions WHERE (date_d, time_d) > ('%s'::date, '16:00:00'::time) AND (date_d, time_d) < ('%s'::date, '16:00:00'::time)''',(selected_day, last_day))
        result = self.cur.fetchall()
        for i in result:
            o = i[0]
            oo = str(o)

        self.lineEdit_19.setText(oo)

  

но я получаю эту ошибку

 self.cur.execute( '''SELECT SUM(montant) AS total FROM transactions WHERE (date_d, time_d) > ('%s'::date, '16:00:00'::time) AND (date_d, time_d) < ('%s'::date, '16:00:00'::time)''',(selected_day, last_day))
psycopg2.ProgrammingError: can't adapt type 'QDate'
  

и представление таблицы вообще не показывает никакого результата

есть ли способ это исправить

Комментарии:

1. Ошибка кажется довольно ясной: psycopg2 не может работать с объектом Qt QDate (что разумно). Вам нужно использовать формат даты, подходящий для используемого вами поля, возможно, с помощью QDate.toString() .

2. я пытаюсь преобразовать в sting, но нет результата в QTableView или в инструкции sql

3. Откройте оболочку python (возможно, через IPython, который поддерживает завершение), попробуйте запустить команды оттуда, чтобы посмотреть, что делают различные параметры toString . И, пожалуйста, изучите документацию, это как минимум ваш третий вопрос по той же теме. Если вы используете QDate, вы должны прочитать всю его справочную страницу .

Ответ №1:

Тип selected_day и last_day есть QDate .Преобразуйте их в строки, например.:

 (selected_day.toString(Qt.ISODate), last_day.toString(Qt.ISODate))
  

Прочитайте об QDate.toString() этом в документации.

Комментарии:

1. извините, это выдает мне эту ошибку NameError: name 'ISODate' is not defined ; и когда я удаляю ISODate, он выдает мне эту psycopg2.errors.SyntaxError: syntax error at or near "Wed" LINE 1: ...tal FROM transactions WHERE (date_d, time_d) > (''Wed Jan 1 ...

2. Конечно, ISODate это из Qt , см. Обновленный ответ.

3. теперь это работает, но pb находится в моей базе данных, формат даты такой » 10/01/2020 » и результат selected_day.toString(Qt. ISODate) формат даты, подобный этому 2020-10-01, поэтому он не дает мне никакого результата вообще

4. Postgres правильно интерпретирует дату ISO в качестве входных данных, независимо от локальных настроек.