API банка <> СУБД

Трёп, флуд, флейм здесь. Реклама, спам и пропаганда наркотиков НЕ приветствуются.
Аватара пользователя
Yuriy
Сообщения: 139
Зарегистрирован: 11 фев 2018, 13:34
Откуда: Киев

API банка <> СУБД

Сообщение Yuriy » 31 мар 2020, 10:54

Здравствуйте!
Подскажите есть ли механизм реализации взаимодействия СУБД с API банка напрямую без привлечения клиентской стороны.
Конкретно: запись в таблицу СУБД курса валют.
:-[

Аватара пользователя
Владимир
Администратор
Сообщения: 687
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

API банка <> СУБД

Сообщение Владимир » 31 мар 2020, 12:23

Не совсем понятен вопрос. Как таковой механизм может возникнуть при наличии API конкретного банка.

Аватара пользователя
Yuriy
Сообщения: 139
Зарегистрирован: 11 фев 2018, 13:34
Откуда: Киев

API банка <> СУБД

Сообщение Yuriy » 31 мар 2020, 12:57

C API банка понятно. Как из СУБД (PostgreSQL) сделать запрос?

Аватара пользователя
Владимир
Администратор
Сообщения: 687
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

API банка <> СУБД

Сообщение Владимир » 31 мар 2020, 14:09

Вопрос стал еще менее понятен...

Аватара пользователя
alador
Сообщения: 54
Зарегистрирован: 14 фев 2018, 17:53

API банка <> СУБД

Сообщение alador » 06 апр 2020, 10:22

Сама СУБД не может делать запросы, это может делать какой-нибудь скрипт, который будет запускаться по таймеру кроном в линукс среде или виндовс через планировщик, и по результатам опроса записывающий в заданную базу полученное значение.

Аватара пользователя
Владимир
Администратор
Сообщения: 687
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

API банка <> СУБД

Сообщение Владимир » 06 апр 2020, 13:55

Cама-то СУБД в принципе может выполнить внешний http-запрос через pg_curl по заданию через pg_task. Однако остались "за кадром" подробности вопроса и можно полжизни думать-гадать над
"с API банка напрямую без привлечения клиентской стороны."
и
"C API банка понятно."

Аватара пользователя
Yuriy
Сообщения: 139
Зарегистрирован: 11 фев 2018, 13:34
Откуда: Киев

API банка <> СУБД

Сообщение Yuriy » 06 апр 2020, 16:36

Спасибо за ответы alador и Владимир.
:book:

Аватара пользователя
Amney
Сообщения: 16
Зарегистрирован: 04 апр 2020, 13:58
Откуда: Вечность
Контактная информация:

API банка <> СУБД

Сообщение Amney » 27 апр 2020, 18:33

Yuriy писал(а):
06 апр 2020, 16:36
Спасибо за ответы alador и Владимир.
:book:
Решили вопрос?

Аватара пользователя
Yuriy
Сообщения: 139
Зарегистрирован: 11 фев 2018, 13:34
Откуда: Киев

API банка <> СУБД

Сообщение Yuriy » 28 апр 2020, 19:13

Amney писал(а):
27 апр 2020, 18:33
Решили вопрос?
Не стал жестко цеплять цены к банку. Вывел текущие курсы на страницу владельца, дальше по его решению на стороне СУБД пересчет цен. Но впереди привязка остатков к сайтам оптовиков, вот там буду делать жесткую привязку. :vava:
СтраницаПоказать
Screenshot_1.png
Screenshot_1.png (95.65 КБ) 2687 просмотров
ТриггерПоказать

Код: Выделить всё

CREATE TRIGGER t_upd_price_currency
    BEFORE UPDATE OF price_currency
    ON public.a_currency
    FOR EACH ROW
    EXECUTE PROCEDURE public.f_upd_currency();
ФункцияПоказать

Код: Выделить всё

DECLARE

	-- Table: public.a_currency
	var_name_currency  character varying(4);
	var_price_currency numeric(6,4);
	
	-- FUNCTION: public.f_upd_currency()
	var_id_f                 integer;
	var_price_currency_f     numeric(9,2);
	var_old_price_currency_f numeric(9,2);
	var_price_f          	   numeric(9,2);
	var_old_price_f          numeric(9,2);
	
	-- Объявляем курсорные переменные обоев
	cursor_wallpaper CURSOR FOR SELECT id_wallpaper, price_currency_wallpaper, old_price_currency_wallpaper
					      		FROM   a_wallpaper 
					      		WHERE  currency_wallpaper = var_name_currency
					      	  ORDER BY id_wallpaper ASC;
	
	-- Объявляем курсорные переменные освещения
	cursor_lighting CURSOR FOR SELECT id_lighting, price_currency_lighting, old_price_currency_lighting
					      		FROM   a_lighting 
					      		WHERE  currency_lighting = var_name_currency
					      	  ORDER BY id_lighting ASC;
							  
	-- Объявляем курсорные переменные декора
	cursor_decor CURSOR FOR SELECT id_decor, price_currency_decor, old_price_currency_decor
					      	FROM   a_decor 
					      	WHERE  currency_decor = var_name_currency
					      	ORDER BY id_decor ASC;
							  
	-- Объявляем курсорные переменные клея
	cursor_glue CURSOR FOR SELECT id_glue, price_currency_glue, old_price_currency_glue
					      	FROM   a_glue 
					      	WHERE  currency_glue = var_name_currency
					      	ORDER BY id_glue ASC;							  
	
BEGIN

-- РЕДАКТИРОВАНИЕ	
	IF TG_OP = 'UPDATE' THEN -- редактирование записи

		var_name_currency  = NEW.name_currency;
		var_price_currency = NEW.price_currency;
			
		-- Открываем курсор обоев
		OPEN cursor_wallpaper;
			-- начало цикла выборки из курсора обоев	
			LOOP 

				FETCH cursor_wallpaper INTO var_id_f, var_price_currency_f, var_old_price_currency_f;
				
					--если такого нет, то мы выходим
					IF NOT FOUND THEN 
						EXIT;
					END IF;
				
					var_price_f = var_price_currency_f * var_price_currency;
					var_old_price_f = var_old_price_currency_f * var_price_currency;
					
					-- обновляем цену обоев
					UPDATE a_wallpaper
					SET    price_wallpaper = var_price_f, old_price_wallpaper = var_old_price_f
					WHERE  id_wallpaper = var_id_f;

			-- конец цикла выборки из курсора обоев
			END LOOP; 
		-- закрываем курсор обоев
		CLOSE cursor_wallpaper; 
		
		-- Открываем курсор освещения
		OPEN cursor_lighting;
			-- начало цикла выборки из курсора освещения	
			LOOP 

				FETCH cursor_lighting INTO var_id_f, var_price_currency_f, var_old_price_currency_f;
				
					--если такого нет, то мы выходим
					IF NOT FOUND THEN 
						EXIT;
					END IF;
				
					var_price_f = var_price_currency_f * var_price_currency;
					var_old_price_f = var_old_price_currency_f * var_price_currency;
					
					-- обновляем цену освещения
					UPDATE a_lighting
					SET    price_lighting = var_price_f, old_price_lighting = var_old_price_f
					WHERE  id_lighting = var_id_f;

			-- конец цикла выборки из курсора освещения
			END LOOP; 
		-- закрываем курсор освещения
		CLOSE cursor_lighting;
		
		-- Открываем курсор декора
		OPEN cursor_decor;
			-- начало цикла выборки из курсора декора	
			LOOP 

				FETCH cursor_decor INTO var_id_f, var_price_currency_f, var_old_price_currency_f;
				
					--если такого нет, то мы выходим
					IF NOT FOUND THEN 
						EXIT;
					END IF;
				
					var_price_f = var_price_currency_f * var_price_currency;
					var_old_price_f = var_old_price_currency_f * var_price_currency;
					
					-- обновляем цену декора
					UPDATE a_decor
					SET    price_decor = var_price_f, old_price_decor = var_old_price_f
					WHERE  id_decor = var_id_f;

			-- конец цикла выборки из курсора декора
			END LOOP; 
		-- закрываем курсор декора
		CLOSE cursor_decor;
		
		-- Открываем курсор клея
		OPEN cursor_glue;
			-- начало цикла выборки из курсора клея	
			LOOP 

				FETCH cursor_glue INTO var_id_f, var_price_currency_f, var_old_price_currency_f;
				
					--если такого нет, то мы выходим
					IF NOT FOUND THEN 
						EXIT;
					END IF;
				
					var_price_f = var_price_currency_f * var_price_currency;
					var_old_price_f = var_old_price_currency_f * var_price_currency;
					
					-- обновляем цену клея
					UPDATE a_glue
					SET    price_glue = var_price_f, old_price_glue = var_old_price_f
					WHERE  id_glue = var_id_f;

			-- конец цикла выборки из курсора клея
			END LOOP; 
		-- закрываем курсор клея
		CLOSE cursor_glue;		

		RETURN NEW;

	END IF; 
END;

Аватара пользователя
Yuriy
Сообщения: 139
Зарегистрирован: 11 фев 2018, 13:34
Откуда: Киев

API банка <> СУБД

Сообщение Yuriy » 04 июн 2020, 21:27

Yuriy писал(а):
28 апр 2020, 19:13
Но впереди привязка остатков к сайтам оптовиков, вот там буду делать жесткую привязку. :vava:
Поставщики сбрасывают остатки на почту прикрепленными файлами .xls, .xlsx.
В СУБД присутствует процедурный язык PL/Python, который позволяет писать функции PostgreSQL на языке Python.
Благодаря этому мы из СУБД заходим в почтовый ящик, получаем прикрепленный файл, берем нужные колонки и строки и заносим их в таблицы СУБД.
ФункцияПоказать

Код: Выделить всё

-- FUNCTION: public._a1_atlas_python()

-- DROP FUNCTION public._a1_atlas_python();

CREATE OR REPLACE FUNCTION public._a1_atlas_python(
	)
    RETURNS text
    LANGUAGE 'plpython3u'

    COST 100
    VOLATILE 
AS $BODY$import imaplib
import email
import xlrd
import os
import datetime

mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
mail.login('nnn.nnnn@gmail.com', 'passpppp')
mail.list()
mail.select('INBOX')

typ, data = mail.search(None, '(FROM "nnnnn@kiev.nnn.net")')

f = open('data', 'w')
fg = data[0].split()
for num in fg:
     typ, data = mail.fetch(num, '(RFC822)')
     f.write('Message %sn%sn' % (num, data[0][1]))

if fg:
    mail.store(fg[0], '+FLAGS', '\\Deleted') # удаляем письмо
    mail.expunge()
else:
    return 'no mail' 

f.close()
mail.close()
mail.logout()

mail = email.message_from_bytes(data[0][1]) # получаем прикрепленный файл

if mail.is_multipart():
    for part in mail.walk():
        content_type = part.get_content_type()
        filename = part.get_filename()
        if filename:
            # Нам плохого не надо, в письме может быть всякое барахло
            with open(part.get_filename(), 'wb') as new_file:
                new_file.write(part.get_payload(decode=True))
	
                book = xlrd.open_workbook(filename)
                sheet = book.sheet_by_name('TDSheet')
				
                purge = plpy.prepare("DELETE FROM a1_atlas") # удаляем предыдущие данные из базы
                plpy.execute(purge)

                datel = datetime.date.today()
                plandate = plpy.prepare("UPDATE a0_suppliers_date SET atlas = $1 WHERE id_date = 1", ["text"])

                plan = plpy.prepare("INSERT INTO a1_atlas (name, series, total_kyiv, total_odessa) values($1,$2,$3,$4)", ["text", "text", "text", "text"])

                for r in range(1, sheet.nrows):
                    name = sheet.cell(r,0).value
                    series = sheet.cell(r,6).value
                    total_kyiv = sheet.cell(r,8).value
                    total_odessa = sheet.cell(r,9).value  
                    plpy.execute(plan, [name, series, total_kyiv, total_odessa])
										
                file_path = ('/var/lib/postgresql/10/main/' + filename) # удаляем файл из директории postgresql
                os.remove(file_path)
                plpy.execute(plandate, [datel])				
                return filename
return 'no file'

$BODY$;

ALTER FUNCTION public._a1_atlas_python()
    OWNER TO postgres;

Ответить