rmfalx
@rmfalx

Как написать скрипт на Python, который будет вносить изменения в БД Postgress?

Ситуация такая, некоторые пользователи могут провести неверную операцию с деньгами. Например пришло на кассу 500 Руб. а оператор нечаянно вбил 5000. В итоге касса не сходится. Нужно вручную лезть в базу данных и по id операции искать ее, менять сумму на правильную, а затем еще и переформировывать документы.

К сожалению таких операций последнее время очень много и я хотел бы написать скрипт, который автоматически будет вносить изменения.
Как я это делаю вручную. Подключаюсь к базе и имею 3 типа входных данных - id операции, сумма правильная, может дата когда была операция.

Имею
id = 13662014
Сумма = 2000

  • Ищу операцию
    SELECT id, date_created, office_id, date_issued, summ, docnumber, contragent_name, contragent_document_number
    FROM public.main_operation
    where id  = 13662014;

  • Получаю операцию
    id    |         date_created          | office_id |          date_issued          |    summ    | docnumber |    contragent_name     | contragent_document_number 
    ----------+-------------------------------+-----------+-------------------------------+------------+-----------+------------------------+----------------------------
     13662014 | 2017-11-07 08:54:09.098759+00 |       320 | 2017-11-07 08:54:09.099048+00 | 3000.00000 |           | Бобкова ОкÑана Юрьевна | 
    (1 row)

  • Меняю сумму с 3000 на 2000
UPDATE public.main_operation SET  summ=2000.0 WHERE id=13662014;
  • Затем нужно изменить сумму в операции в кассу
SELECT id, "number", cashday_id, operation_id, ground, office_name, created, changed, amount, cashier
FROM public.cash_bookentry
where  operation_id = 13662014;
  • Получили операцию
id    | number | cashday_id | operation_id |     ground     | office_name |            created            |            changed            | amount  |        cashier         
----------+--------+------------+--------------+----------------+-------------+-------------------------------+-------------------------------+---------+------------------------
 13840384 |   8216 |     324479 |     13662014 | Размен-Возврат | ТП ТомÑк 2  | 2017-11-07 08:54:09.209394+00 | 2017-11-07 08:54:09.377073+00 | 3000.00 | Кригер Елена Сергеевна
(1 row)
  • Обновляю с 2 на 3
UPDATE public.cash_bookentry SET amount=2000.0 WHERE id=13840384;
  • Теперь нужно изменить состояние кассы. У кассы есть 2 состояние - на момент открытия кассового дня и на момент закрытия. Ищу операцию по времени и номеру кассы
SELECT id, book_date, office_id, is_closed, beginning_balance, ending_balance, exact_time, user_id, editor_id, count_pages
	FROM public.cash_cashday
WHERE (book_date between '2017-11-07' and '2017-11-08') and office_id = 320;
  • Получаю 2 записи. На момент открытия и на момент закрытия
id   | book_date  | office_id | is_closed | beginning_balance | ending_balance |    exact_time    | user_id | editor_id | count_pages 
--------+------------+-----------+-----------+-------------------+----------------+------------------+---------+-----------+-------------
 324479 | 2017-11-07 |       320 | t         |         106876.63 |      121036.13 | 1510020734.35554 |    6083 |      6535 |           2
 324716 | 2017-11-08 |       320 | t         |         121036.13 |      121227.63 | 1510103344.58973 |    4853 |      6083 |           2
  • По логике мне нужно удалить штуку (1000). Делаю запросы
UPDATE public.cash_cashday SET  beginning_balance=106876.63, ending_balance=120036.13 WHERE id = 324479;
UPDATE public.cash_cashday SET  beginning_balance=120036.13, ending_balance=120227.63 WHERE id = 324716;
  • Далее есть еще одна сущность, в которой так же нужно внести изменения
SELECT * FROM cashflow_balance WHERE office_id = 320 and (day between '2017-11-07' and '2017-11-08') ;
id   |    day     | cashflow_type | office_id | balance_start 
--------+------------+---------------+-----------+---------------
 562646 | 2017-11-07 |             0 |       320 |     106876.63
 562896 | 2017-11-08 |             0 |       320 |     121036.13
(2 rows)
  • И меняю
UPDATE public.cashflow_balance SET balance_start = 120036.13 WHERE id = 562896;


Хочу заавтоматизировать это все дело. Помогите с чего начать? Куда двигаться. Хотелось бы чтобы скрипт работал так
  • скрипту на вход дают id и верную сумму.
  • Далее он выполняет SELECT по поиску самой операции.
  • Мы видим, что это та самая.
  • нажимаем Enter
  • Он мне делает UPDATE
  • Смотрю результат
  • Нажимаю Enter
  • Следующий SLECT
  • Результат
  • UPDATE
  • результат


И т.д. может у вас будет лучше какой-то алгоритм. Помогите плиз.

ИМЕЮ БАЗОВЫЕ ЗНАНИЯ ПО PYTHON. ЕСТЬ СЕРТИФИКАТ PYTHON STARTER. Поэтому не пишите плиз - учи питон или найми программиста. Дайте направление куда двигаться.
  • Вопрос задан
  • 1116 просмотров
Пригласить эксперта
Ответы на вопрос 4
x67
@x67
Ставь Psycopgsql или sql alchemy и радуйся жизни.
Я пользуюсь первым гайдов и примеров мильон.
Если есть сертификат, то наверняка что то типа теста или текстовой рпг на питоне уже писал. Так вот - тут ничего нового кроме библиотеки psycopgsql
Ответ написан
initd.org/psycopg/docs

Тут всё что Вам нужно. Или в Гугл с запросом "psycopg2"
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
сначала плюньте в глаза тому, кто выдал сертификат

потом освойте гугл , туда в строку вбиваете "python postgresql примеры"

примерно первый будет eax.me/python-postgresql
Ответ написан
chewarer
@chewarer
Не вижу в чем ваша проблема. Питон мало мальски знаете, sql знаете, алгоритм придумали.
Осталось только взять и написать. Базовых знаний хватит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы