Найти - Пользователи
Полная версия: Работа с psycopg2
Начало » Центр помощи » Работа с psycopg2
1
MaratD
Здравствуйте, уважаемые.
Планируется работа с postgresql. Библиотека psycopg2 умеет работать с типом NUMERIC? Нужна точность при операциях обновления и выборке с группировкой. У кого есть опыт подскажите пожалуйста.
JOHN_16
MaratD
У кого есть опыт подскажите пожалуйста.
Опыт чтения документации? У меня, вот Adaptation of Python values to SQL types
MaratD
Прочитал.
decimal преобразуется в NUMERIC при записи. NUMERIC преобразуется в decimal при чтении.
Я спрашивал про другое.
JOHN_16
Тогда поясните в конкретно ваш вопрос
FishHook
MaratD
Я спрашивал про другое.

Приведите пример предполагаемой вами ситуации в виде кода. Пока не ясно, что именно вас беспокоит. Очевидно, что если вы передадите decimal как параметр запроса, библиотека преобразует значение в соответствующий тип (ну как бы по логике должна), сам запрпос будет выполняться СУБДшкой. Что получится после фетча вы можете проверить элементарно, выполните запрос да и проверьте тип.
MaratD
Попробую спросить по другому.
С postgresql не работал раньше. Пробовал с sqlite3. Предположим в sqlite3 имеется таблица, в которой есть столбец типа REAL.
При попытке выполнить запрос к этой таблице с группировкой (агрегатная функция суммы по этому столбцу) получаешь не тот результат, который ожидаешь. Это из-за особенностей типа REAL.
При попытке обновить запись в этой таблице то же самое (обновленное значение получается путем сложения REAL).
Чтобы все точно считалось надо все предварительно переводить в decimal.
postgresql облегчит эту работу с такой таблицей если вместо REAL будет NUMERIC? Не надо будет снова переводить данные в decimal?
doza_and
MaratD
Не надо будет снова переводить данные в decimal?

Ваши сомнения удивляют, мне вас трудно понять.

Откуда нам знать надо вам numeric переводить в decimal или нет? В питоне нет numeric вы с ним работать ну никак не сможете в питоне. В postges он есть там можно с ним работать. Что тут еще добавить?
MaratD
Всем здравствуйте. Попробую еще раз спросить по другому.
В sqlite3 были случаи, когда делаешь запрос с группировкой, то получаешь, например, следующее 7894.8529999999999… . Хотя, если сложить, должно 7894.853.
psycopg2 так же суммирует numeric?
FishHook
MaratD
Хотя, если сложить, должно 7894.853
Никому оно не должно. Каждый тип занимает в памяти строго определенное количество байт. Поэтому при операциях с большими целыми, у вас внезапно может случиться казузс. Например, мы считаем 32700 * 3 / 3 и по идее, чисто математически, вы должны получить 32700. Но если для хранения чисел мы используем ячейки по два байта, то результат промежуточной операции 32700 * 3 должен занять четыре байта. Что получим в результате? Да что угодно, зависит от реализацции, как именно компьютер обработает переполнение. С нецелыми числами еще все хуже, потому что дроби бывают бесконечными и записать их в любое количество памяти нельзя, например результат операции 1/3 никогда не будет точным. Для того, чтобы избежать недоразумений при банковских и других точных математических операциях используют специальный двоично-десятичный тип. Вот тот самый decimal про который говорили выше.

MaratD
В sqlite3 были случаи
Значит вы использовыали неправильный тип данных.

MaratD
psycopg2 так же суммирует numeric
psycopg2 ничего не суммирует. Это библиотека для отправки и получения запросов в/из СУБД. Суммировать будет СУБД. К питону вопросы СУБД не имеют никакого отношения, если вы не верно спроектируете схему базы данных, ни питон, ни psycopg2 ни кто бы то ни было другой не будут иметь к этому никакого отношения.
MaratD
Спасибо всем.
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