вторник, 8 сентября 2015 г.

Получение внешних связей для таблицы в PostgreSQL

Иногда бывает необходимо удалить строки из таблицы, с которыми связаны через внешние ключи строки в других таблицах.
Интерфейс PgAdmin не позволяет узнать все внешние связи для  данной таблицы.
Разработчики фактически предлагают нам проверять каждую таблицу, кликая на пункт "Ограничения" (constraints) в дереве, и проверять, есть ли связь с исходной таблицей или нет.
Чтобы обойти это ограничение я пользуюсь следующим запросом, позволяющим выявить внешние связи для полей определенной таблицы:



select confrelid::regclass as table_source
, af.attname as source_key,
conrelid::regclass as table_dest,
a.attname as dest_key,
ss2.conname as constraint_name
from pg_attribute af, pg_attribute a,
(select conrelid,confrelid,conkey[i] as conkey, confkey[i] as confkey,conname
from (select conrelid,confrelid,conkey,confkey,
generate_series(1,array_upper(conkey,1)) as i,conname
from pg_constraint where contype = 'f') ss) ss2
where af.attnum = confkey and af.attrelid = confrelid and
a.attnum = conkey and a.attrelid = conrelid
AND confrelid::regclass = 'gateway.as_goods'::regclass
order by conrelid::regclass,a.attname;



gateway.as_goods - это исходная таблица, для которой выявляются внешние связи ( с указанием схемы )


Выходные столбцы:

table_source - исходная таблица (в примере - gateway.as_goods)
source_key - поле-ключ из исходной таблицы 
table_dest - таблица, связанная с исходной
dest_key - внешний ключ, находящийся в таблице table_dest
constraint_name - наименование внешней связи

Выявив наименование внешней связи, ее можно удалить с помощью команды:


ALTER TABLE table_dest
DROP CONSTRAINT constraint_name;


пятница, 10 апреля 2015 г.

Система форматирования программного кода в HTML

Сайт http://www.tohtml.com/ позволяет  оформить программный код  в HTML для публикации. Мне он показался удобнее других. 

Foreign tables в Postgresql и неработающая команда ALTER SERVER

Всем доброго дня и прекрасного настроения.

Я работаю в крупной торговой компании и поддерживаю принадлежащий компании интернет-магазин (ИМ). 
Практически каждый час цены и другая информация в нашем ИМ должны обновляться. При этом из 1С  цены и информация по товарам выгружается в неудобном формате с идентификаторами 1С. Данная информация выгружается в большом объеме и требует серьезной предварительной обработки. Соответственно когда мы с командой реализовывали этот проект, была выявлена  проблема большой загруженности сервера сайта при обработке выгрузок из 1С. Страдала производительность сайта и соответственно качество обслуживания клиентов. 
Было принято решение обрабатывать данные из 1С с помощью процедур plpgsql в базе Postgresql на отдельном сервере в специальной базе-обработчике, а затем передавать обработанные данные выгрузки из 1С на сервер сайта. При подготовке данных в этой базе-обработчике я использую внешние таблицы  (foreign tables) из модуля расширения postgres_fdw. 

Версия PostgreSQL -  9.3.1, версия postgres_fdw - 1.0


Примерный код создания одной из внешних таблиц ft_goods, позволяющей получить доступ к таблице goods на site_server:

CREATE SERVER site_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.0.100', dbname '#####', port '#####');
create user mapping for public server site_server OPTIONS (user '#####', password '#####');
CREATE FOREIGN TABLE ft_goods
(
id integer, 
name character varying(300),
code character varying(20),
clear_code character varying(20),
brand_id integer,
description character varying(1000))
SERVER site_server OPTIONS (schema_name 'public', table_name 'goods');


Недавно возникла задача по реализации быстрой смены в базе-обработчике адреса сервера сайта (для возможности горячего переключения).
Вначале показалось, что это достаточно просто. Не нужно пересоздавать все внешние таблицы. Достаточно выполнить 2 простые команды


ALTER SERVER site_server OPTIONS (set host 'new IP address',set dbname 'new dbname',set port 'new port');
ALTER USER MAPPING FOR public SERVER site_server OPTIONS (set user 'new user name', set password 'new password');



Тем самым мы меняем настройки соединения сервера для внешних таблиц. Все так и было сделано, но не тут-то было.
Внешние таблицы, несмотря на смены настроек, упорно были привязаны к прежнему серверу.
Запрос вида

select * from ft_goods


возвращал данные со старого сервера привязки, команда ALTER SERVER  не произвела никакого эффекта. 

Возникли следующие пути решения задачи:

1. сменить у всех внеших таблиц SERVER

Выяснилось, что не существует команды 

ALTER FOREIGN TABLE ft_goods
SET SERVER new_site_server;

2. пересоздать объект сервер (CREATE SERVER) и пересоздать все внешние таблицы (CREATE FOREIGN TABLE)

Это неудобное решение поскольку нужно каждый раз при смене основного site_server на new_site_server (настройка в таблице параметров соединения с сервером назначения) выполнять скрипт пересоздания всех этих внешних объектов. Скрипт должен содержать 
все внешние таблицы, иначе при дальнейшей работе будут ошибки.


Гораздо удобнее было бы найти в системных таблицах связь между объектом SERVER и foreign tables и сменить привязку. Я стал исследовать эту возможность и нашел нужные системные таблицы pg_foreign_server, pg_foreign_table.

Посмотреть информацию по объектам SERVER можно запросом:

select oid,* from pg_foreign_server

Привязка внешней таблицы к серверу выявляется другим запросом:

select * from pg_foreign_table

Столбец ft_server - это как раз oid актуального сервера из таблицы pg_foreign_server.

Для решения проблемы я принял решение создавать новый  объект SERVER и привязывать к нему существующие внешние таблицы через обновление столбца ft_server в pg_foreign_table.

--создаем новый объект
CREATE SERVER new_site_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'new IP address', dbname 'new dbname', port 'new port');
create user mapping for public server new_site_server OPTIONS (user 'new user name', password 'new password');
--теперь все таблицы привязываем к новому серверу
update pg_foreign_table set ftserver=(select oid from pg_foreign_server where srvname='new_site_server' limit 1);


После этих манипуляций стало возможно переключать внешние таблицы на другой сервер БД и соответственно быстро осуществлять выгрузку данных на новый сервер баз данных для   сайта.

пятница, 13 февраля 2015 г.

Витамины, необходимые для зрения

Достаточно давно я заинтересовался вопросом, какие продукты особенно полезны для нашего зрения. Оказалось, что эти продукты отличаются от других большим содержанием витаминов, полезных для глаз. Привожу схему, показывающую информацию об основных витаминах, а также информирующую, в каких продуктах особенно много содержится тех или иных витаминов.





Схему можно также скачать в pdf-формате.

воскресенье, 31 августа 2014 г.

Программа для вычисления юлианской даты

Когда-то давно (в 2010 году) я написал эту программу, работая во ФГУП ВНИИФТРИ (Научно исследовательский институт физико-техничесих и радио-технических измерений). Вместе с коллегами приходилось заниматься  разработкой ПО для расчетов корректировок стандартов времени и частоты. Понадобилось простенькое приложение для определения юлианских дат, которое собственно и сделал. 

Программа вычисляет как юлианскую дату, так и модицифированную юлианскую дату.
Юлианский день (JD) - это астрономический способ измерения времени, число дней с полудня 1 января 4713 г. до н. э. по юлианскому календарю.
Модифицированный юлианский день (MJD) используется для простоты астрономических расчетов и равен MJD=JD-2400000,5.
Следует отметить что в большинстве астрономических бюллетеней даты указываются в формате MJD.

Ссылка на программу MJDTranslate.exe
Программа выложена на Софт.mail.ru вот здесь


вторник, 26 августа 2014 г.

Как Punto Switcher помогает мне в программировании

Когда пишу sql-код, часто сталкиваюсь с необходимостью писать длинные и стандартные типовые команды, вроде:
  • select * from table where;
  •  delete from table where;
  • update table set where;
  • create table aaa(bbb intcomment on table aaa is ‘lalala’; alter table aaa owner to dbuser;

К сожалению, в замечательной программе разработки pgAdmin отсутствует автодополнение кода и практически все команды приходится писать полностью, зная наизусть.  Долгое время я так и делал, пока не открыл дополнительные возможности Punto Switcher. В этой программе помимо переключения раскладки можно настроить автозамену текста по определенным сокращениям.
Как настроить:
  1. Кликнуть значок Punto Switcher, далее “Дополнительно”/“Список автозамены” 
  2. Кликаем на “Список автозамены”, далее “Редактировать”  и видим список сокращений, заменяемых  на полные команды.
  3. После нажатия кнопки “Добавить” вписываем сокращение команды и полный текст, которым заменяется сокращенная команда.

После настройки автозамены ее просто применить. Набираем в любом  редакторе  сокращение команды, Punto Switcher предлагает автозамену в желтой всплывающей строке, нажимаем Enter и программа производит автозамену сокращенного текста на предлагаемый.




Этот лайфхак увеличил мою скорость при написании скриптов.
Каталог блогов Blogolist