Найти - Пользователи
Полная версия: PyQt4(QDateEdit)+kinterbasdb+select даты
Начало » GUI » PyQt4(QDateEdit)+kinterbasdb+select даты
1
lotro
Добрый день! Не уверен в ту ветку написал или нет.
Есть проблема при выполнении запроса к БД Firebird(1.5). Есть главное окно, в нем виджет QDateEdit. Из виджета читаю текущее значение строкой
day1 = MainWindow.dateEdit_3.date()
На выходе получается строка
PyQt4.QtCore.QDate(2012, 10, 31)
Если вытаскивать значение виджета строкой
day1 = MainWindow.dateEdit_3.date().toString('yyyy-MM-dd')
, то на выходе строка “2012-10-31”. При выполнении скул запроса к БД строкой
 'select * from jurnaltable where data = %s' % (day1, )
, то при первом случае получается код:
day1 = MainWindow.dateEdit_3.date()
exetime1 = 'select * from jurnaltable where data = %s' % (day1, )
mycursor.execute(exetime1)
с результирующей ошибкой:

select * from jurnaltable where data = PyQt4.QtCore.QDate(2012, 10, 31)
select * from jurnaltable where data = PyQt4.QtCore.QDate(2012, 10, 31)
Traceback (most recent call last):
File “C:\Python27\Lib\site-packages\PyQt4\perem0.2.py”, line 282, in search
mycursor.execute(exetime1)
kinterbasdb.ProgrammingError: (-104, ‘isc_dsql_prepare: \n Dynamic SQL Error\n
SQL error code = -104\n Token unknown - line 1, column 52\n .’)


При втором случае получается код
day1 = MainWindow.dateEdit_3.date().toString('yyyy-MM-dd')
exetime1 = 'select * from jurnaltable where data = %s' % (day1, )
mycursor.execute(exetime1)
и выдает ошибку

select * from jurnaltable where data = PyQt4.QtCore.QDate(2012, 10, 31)
select * from jurnaltable where data = PyQt4.QtCore.QDate(2012, 10, 31)
Traceback (most recent call last):
File “C:\Python27\Lib\site-packages\PyQt4\perem0.2.py”, line 282, in search
mycursor.execute(exetime1)
kinterbasdb.ProgrammingError: (-104, ‘isc_dsql_prepare: \n Dynamic SQL Error\n
SQL error code = -104\n Token unknown - line 1, column 52\n .’)


Чую что проблема в формате получения даты из виджета и передачи значения на выборку из БД. Гуглил. Мануалы на английской понять не смог. Запись в эту БД кодом
date = datetime.date.today()
mycursor.execute(exe, (n, naim, kol, date, ))
проходила “на ура”. Заранее благодарен за совет
reclosedev
После такого
exetime1 = 'select * from jurnaltable where data = %s' % (day1, )
в exetime1 будет
"select * from jurnaltable where data = 2012-10-02"
хотя должно быть
"select * from jurnaltable where data = '2012-10-02'"

Чтобы об этом не думать, почти во всех ДБ библиотеках существует подстановка параметров:
exetime1 = 'select * from jurnaltable where data = %s'
mycursor.execute(exetime1, (day1, ))
которая еще и спасает от SQL Injection.
lotro
Благодарю за совет. Сделал как Вы подсказали.

day1 = MainWindow.dateEdit_3.date()
exetime1 = 'select * from jurnaltable where data = (?)'
mycursor.execute(exetime1, (day1, ))

Ругается на неверный тип:

File “C:\Python27\Lib\site-packages\PyQt4\perem0.2.py”, line 282, in search
mycursor.execute(exetime1, (day1, ))
File “C:\Python27\lib\site-packages\kinterbasdb\typeconv_datetime_stdlib.py”,
line 47, in date_conv_in
% ( str(dt.date), str(type(dtObj)) )
kinterbasdb.InterfaceError: Required type: <type ‘datetime.date’> ; supplied typ
e: <class ‘PyQt4.QtCore.QDate’>

Как тип PyQt4.QtCore.QDate (значение времени из виджета) привести к типу datetime.date?
Или QString к типу datetime.date?
Заранее благодарен.
reclosedev
lotro
Как тип PyQt4.QtCore.QDate (значение времени из виджета) привести к типу datetime.date?
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qdate.html#toPyDate
lotro
Кому пригдиться может. Получилось такой конструкцией преобразовать QString в String, а ее дальше в datetime.datetime.

import datetime
...
day1 = str(MainWindow.dateEdit_3.date().toString('yyyy-MM-dd'))
day1 = datetime.datetime.strptime(day1, '%Y-%m-%d')
Но в переменной day1 тянуться часы с минутами и секундами. Вот думаю они мне в дальнейшем не помешают
lotro
reclosedev
lotro
Как тип PyQt4.QtCore.QDate (значение времени из виджета) привести к типу datetime.date?
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qdate.html#toPyDate
Благодарю. Ваш совет более идеалогически выдержан.
(А ведь видел в доках это, но не понял)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB