Russian Qt Forum

Qt => Базы данных => Тема начата: Пытон от Февраль 12, 2017, 21:45



Название: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: Пытон от Февраль 12, 2017, 21:45
Требуется доступ к БД firebird из PyQt4, чтобы можно было быстро загружать таблицы в QSqlTableModel.
В поставке PyQt4 нет драйвера qibase!
Всё, что нахожу в интербреде - как создать этот драйвер для Qt. А мне нужен драйвер для PyQt!

Можно, конечно, использовать модуль fdb для самого питона, и написать унылую программу, уныло-медленно в цикле переносящую данные из объекта-курсора в модель. А также чудно обломаться с автоматическим занесением изменённых данных из модели обратно в БД.

-----
В общем-то, меня интересует в большей степени возможность работы PyQt4 "из коробки" с какой-нибудь БД, типа SQLite. Чтобы эта БД хранила все свои таблицы в одном файле (в любом месте на диске), чтобы её можно было спокойно скопировать. И, в отличие от трижды проклятой за это SQLite, имела бы нормальную работу с типом Decimal (числа с фиксированной дробной частью). В SQLite имеется лишь чёртов float, который никак не подходит для хранения денежных сумм.
-----
Без проблем с PyQt4 удаётся подключиться к MySQL. Но не нужен мне этот серверище. Совершенно не нужен. Базы в нём просто так не скопируешь, в любое место на диске базы не пораскидаешь.


P.S. ОС Windows 7


Название: Re: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: gil9red от Февраль 13, 2017, 08:52
PyQt4/5 были сгенерированы из Qt какой-то утилитой (нагуглить можно), поэтому можно и на Qt сделать драйвер, если так захочется

У питона есть офигенная библиотека для работы с базами данных -- sqlalchemy
может на нее посмотреть?

Скажите, а в каком виде вы храните денежные суммы? Как используется вещественный тип? Для рублей: целая часть -- рубли, дробная -- копейки?


Название: Re: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: Пытон от Февраль 13, 2017, 11:34
PyQt4/5 были сгенерированы из Qt какой-то утилитой (нагуглить можно), поэтому можно и на Qt сделать драйвер, если так захочется

У питона есть офигенная библиотека для работы с базами данных -- sqlalchemy
может на нее посмотреть?

Скажите, а в каком виде вы храните денежные суммы? Как используется вещественный тип? Для рублей: целая часть -- рубли, дробная -- копейки?


1. SqlAlchemy разве позволяет делать GUI? Или мне её опять же с PyQt использовать, и опять же в tablemodel придётся запихивать данные, так сказать, вручную?

2. Именно так и пытался использовать. Но float для этого не подходит. Переводить всё в копейки и записывать в INTEGER тоже не вариант. В базе есть столбцы: количество, тариф, сумма. Количество тоже может быть дробным! В какие копейки я его переведу количество? Оно в копейках не измеряется.
Можно записывать данные типа Decimal в текстовые поля, но тогда придётся всё их вычисление, включая суммирование столбцов, повесить на сам Python. Вот захочешь сделать sum fieldname from mytable, а сук... скулайт тебе всё услужливо суммирует, только сама переведёт каждое из значений в чёртов float. Так что придётся делать select fieldname from mytable, и складывать (попутно переводя строки в Decimal.decimal) значения из строк курсора.


Название: Re: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: gil9red от Февраль 13, 2017, 12:11
1. Нет, конечно, нет. Придется вручную данные вытаскивать и с ними работать. Сначала проверьте, что он позволяет работать с нужной вам базой, а после можно и подумать как его удобно использовать в вашем проекте
2. Обычно под сумму отводится два целочисленных значения :) (по крайней мере, где-то видел рекомендации, наверное на хабре)


Название: Re: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: vic57 от Февраль 15, 2017, 08:39
2. Обычно под сумму отводится два целочисленных значения :) (по крайней мере, где-то видел рекомендации, наверное на хабре)
это рубли отдельно, копейки отдельно и вычисляешь сам? если можно - поподробнее


Название: Re: Можно ли как-то создать драйвер qibase для PyQt4?
Отправлено: gil9red от Февраль 15, 2017, 09:29
Ну, эта тема сложная и немного холиварная :)

Нет единного мнения на это
Кто-то использует вещественные числа с фиксированной длиной для хранения денег, но оговаривает про округление
Кто-то хранит в разменной денежной единице (например, копейки), а после делит на 100 для получения рублей

Вещественные числа не очень подходят для хранения различной валюты, ведь деньги (рубли, центы) не всегда состоят ровно из 100 разменных денежных единиц, вот тут можно увидеть это: Список существующих валют (https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82)

А тут (https://toster.ru/q/23947) и тут (http://stackoverflow.com/questions/628637/best-data-type-for-storing-currency-values-in-a-mysql-database) я читал обсуждение


Мое мнение -- делайте как вам будет удобно, ну и осторожно нужно работать с вещественными из-за округления