#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 в качестве входных данных, независимо от локальных настроек.