Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2019 09:23:59

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с psycopg2

Здравствуйте, уважаемые.
Планируется работа с postgresql. Библиотека psycopg2 умеет работать с типом NUMERIC? Нужна точность при операциях обновления и выборке с группировкой. У кого есть опыт подскажите пожалуйста.

Офлайн

#2 Май 23, 2019 11:00:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с psycopg2

MaratD
У кого есть опыт подскажите пожалуйста.
Опыт чтения документации? У меня, вот Adaptation of Python values to SQL types



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Май 23, 2019 13:06:58

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с psycopg2

Прочитал.
decimal преобразуется в NUMERIC при записи. NUMERIC преобразуется в decimal при чтении.
Я спрашивал про другое.

Офлайн

#4 Май 23, 2019 13:18:45

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с psycopg2

Тогда поясните в конкретно ваш вопрос



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Май 23, 2019 13:20:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с psycopg2

MaratD
Я спрашивал про другое.

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



Офлайн

#6 Май 24, 2019 10:40:32

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с psycopg2

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

Офлайн

#7 Май 24, 2019 20:55:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Работа с psycopg2

MaratD
Не надо будет снова переводить данные в decimal?

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

Откуда нам знать надо вам numeric переводить в decimal или нет? В питоне нет numeric вы с ним работать ну никак не сможете в питоне. В postges он есть там можно с ним работать. Что тут еще добавить?



Офлайн

#8 Май 27, 2019 08:06:07

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с psycopg2

Всем здравствуйте. Попробую еще раз спросить по другому.
В sqlite3 были случаи, когда делаешь запрос с группировкой, то получаешь, например, следующее 7894.8529999999999… . Хотя, если сложить, должно 7894.853.
psycopg2 так же суммирует numeric?

Офлайн

#9 Май 27, 2019 09:10:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с psycopg2

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

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

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



Офлайн

#10 Май 28, 2019 07:16:57

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с psycopg2

Спасибо всем.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version