Форум сайта python.su
Здравствуйте, уважаемые.
Планируется работа с postgresql. Библиотека psycopg2 умеет работать с типом NUMERIC? Нужна точность при операциях обновления и выборке с группировкой. У кого есть опыт подскажите пожалуйста.
Офлайн
MaratDОпыт чтения документации? У меня, вот Adaptation of Python values to SQL types
У кого есть опыт подскажите пожалуйста.
Офлайн
Прочитал.
decimal преобразуется в NUMERIC при записи. NUMERIC преобразуется в decimal при чтении.
Я спрашивал про другое.
Офлайн
Тогда поясните в конкретно ваш вопрос
Офлайн
MaratD
Я спрашивал про другое.
Офлайн
Попробую спросить по другому.
С postgresql не работал раньше. Пробовал с sqlite3. Предположим в sqlite3 имеется таблица, в которой есть столбец типа REAL.
При попытке выполнить запрос к этой таблице с группировкой (агрегатная функция суммы по этому столбцу) получаешь не тот результат, который ожидаешь. Это из-за особенностей типа REAL.
При попытке обновить запись в этой таблице то же самое (обновленное значение получается путем сложения REAL).
Чтобы все точно считалось надо все предварительно переводить в decimal.
postgresql облегчит эту работу с такой таблицей если вместо REAL будет NUMERIC? Не надо будет снова переводить данные в decimal?
Офлайн
MaratD
Не надо будет снова переводить данные в decimal?
Офлайн
Всем здравствуйте. Попробую еще раз спросить по другому.
В sqlite3 были случаи, когда делаешь запрос с группировкой, то получаешь, например, следующее 7894.8529999999999… . Хотя, если сложить, должно 7894.853.
psycopg2 так же суммирует numeric?
Офлайн
MaratDНикому оно не должно. Каждый тип занимает в памяти строго определенное количество байт. Поэтому при операциях с большими целыми, у вас внезапно может случиться казузс. Например, мы считаем 32700 * 3 / 3 и по идее, чисто математически, вы должны получить 32700. Но если для хранения чисел мы используем ячейки по два байта, то результат промежуточной операции 32700 * 3 должен занять четыре байта. Что получим в результате? Да что угодно, зависит от реализацции, как именно компьютер обработает переполнение. С нецелыми числами еще все хуже, потому что дроби бывают бесконечными и записать их в любое количество памяти нельзя, например результат операции 1/3 никогда не будет точным. Для того, чтобы избежать недоразумений при банковских и других точных математических операциях используют специальный двоично-десятичный тип. Вот тот самый decimal про который говорили выше.
Хотя, если сложить, должно 7894.853
MaratDЗначит вы использовыали неправильный тип данных.
В sqlite3 были случаи
MaratDpsycopg2 ничего не суммирует. Это библиотека для отправки и получения запросов в/из СУБД. Суммировать будет СУБД. К питону вопросы СУБД не имеют никакого отношения, если вы не верно спроектируете схему базы данных, ни питон, ни psycopg2 ни кто бы то ни было другой не будут иметь к этому никакого отношения.
psycopg2 так же суммирует numeric
Офлайн
Спасибо всем.
Офлайн