Помогите по работе с двумя базами данных.

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

Пытаюсь это дело автоматизировать. Выглядит оно примерно так:

1.Читаем строки из базы gps таблица object1:

SELECT external_id,coord_y,coord_x FROM object1 WHERE coord_x>0 AND coord_y>0 AND device_id=0  ORDER BY external_id

где external_id (integer), coord_y,coord_x (double precision), (упорядочивание необязательно, делал для проверки просто)

2. Теперь полученные данные нужно перенести в другую базу mgs таблицу object2, ориентируясь на следующие вводные:

- ищем в object2 строку с object_ext_number = external_id
- читаем в этой строке поле settings формата text
- если в поле settings среди текста есть фрагменты Lat={координата}  Lon={координата} - удаляем эти фрагменты текста.
- добавляем в поле settings в конец уже имеющегося текста фрагменты Lat={coord_y}Lon={coord_x}, ecc-но преобразуя содержимое coord_y,coord_x из double precision в text.

Собс-но сам перенос данных нечастый, но на перенос ручками уйдет дня три-четыре, если не отвлекаться совсем ни на что, а знаний в Постгре не хватает, чтоб облачить эти требования в удобоваримую форму для SQL. Если это не зубодробительная задача - помогите, плз...

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Читаю документацию по

Читаю документацию по Постгре... Поясните, такая передача данных между базами в принципе возможна напрямую или придется прибегать к выгрузке в файл из одной базы и всасыванию в другую?

Передача между базами

Передача между базами возможна - читайте про dblink, но я бы не стал заморачиваться.
Я бы сделал выгрузку НУЖНЫХ вам таблиц и загрузил бы их в родную базу, где потом бы и изголялся, а под конец удалил ненужные таблицы. Даже если у таблиц совпадают имена, никто не мешает выполнить их загрузку, например, в другую схему в этой же БД.

Соглашусь с вами - так

Соглашусь с вами - так действительно выглядит проще, но у меня обе базы рабочие и слияние их - это удел разработчика этих баз.

Судя по постановке задачи -

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

Если оно так как вы пишите,

Если оно так как вы пишите, то я вообще не понимаю такую постановку задачи. Базы находятся на одном сервере и в одной СУБД. Куда проще тогда объединить эти базы в одну и не мучится.

Ответ кроется в разработчиках

Ответ кроется в разработчиках ПО. Они сделали одну часть (сервер охраны) и под нее завели базу, прошли годы, параллельная команда сделала вторую часть ПО (сервер геоотслеживания) и под нее сделали другую базу. Это два отдельных продукта, которые продаются отдельно и могут использоваться независимо друг от друга. А вот у меня они должны работать вместе и к сожалению - я на этом поприще один из первопроходцев. Будучи давно в Unix-like системах админом, я конечно сталкивался с SQL, но к сожалению очень поверхностно и лет 15 назад. Так что я пытаюсь просто сделать для себя костыли, пока разработчики софта заняты борьбой с более важными багами :)

Действительно, давайте попробуем понять

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

Я сам системный администратор, так что скажу вам, что я бы на вашем месте как можно дальше дистанцировался от решения этой задачи. Т.е. я бы обозначил позицию руководству так: я не программист, а админ и занимаюсь администрированием. Для осуществления подобного рода задач, есть разработчики, программисты БД - привлекайте их. Если у вас их в штате нет - наймите их из сторонней организации, но это не ваша задача как администратора писать подобные вещи. Не спешите отмахиваться от моего совета, аргументируя тем, что вы админ в конторе и жнец и певец и на дуде игрец - тогда тем более всё зависит от вас и руководство должно вас слушать. А если вы скажете, что руководство на это на не пойдёт, то я скажу, что это проблемы руководства, а не ваши. Вы им говорите как есть и что должно быть сделано, а дальше у начальства голова большая - вот пусть и думают.

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

Я тоже за такой подход, чтобы

Я тоже за такой подход, чтобы кухарки не управляли государством. Однако у меня немного другие условия. У меня стоит задача переноса координат из одного приложения в другое. Я могу это сделать вручную - это куча времени(дня 4-5 не отвлекаясь больше ни на что, или дней 7-8-х.з. сколько - если я еще отвлекаюсь на другие вещи), могу упереться, что пока нет необходимых инструментов от разрабов и все повиснет на неопределенный срок(что мне не нравится), ибо разрабы не поддаются особому влиянию на эту область т.к. это бета версии продуктов. А могу сделать себе небольшой костыль, до того времени? пока разрабы не разрулят это сами. Выгрузку я уже разрулил...

Обьем данных для мира баз

Обьем данных для мира баз данных - более чем скромный, однако в дальнейшем я бы не отказался от такого инструмента синхронизации. Применяться он будет исключительно вручную и редко.

Давайте попробуем решить

Давайте попробуем решить проблему по частям. Я почитал средства работы со строками в postgre и увидел, что инструменты для решения вроде бы присутствуют. Поэтому, пойдем по порядку.
Итак, пока что я выяснил для себя вот такой момент:

1. coord_x и coord_y у меня формата 99.999999 и хранятся в double precision. При вызове их SELECT и выгрузке в файл происходит такая бяка, как откидывание младших нулей, что логично со стороны математики, но сильно будет мешать потом, когда я захочу вставить эти числа в текстовые поля (из-за разной длины). Логично было бы на этапе выгрузки сразу применить к этим данным что-то типа to_char('coord_x',99.999999), но у меня большой пробел в синтаксисе SQL.
Я как бы знаю слова, но не знаю совершенно, как строить сложносочиненные предложения и деепричастные обороты. Интеллект на уровне дикаря - "я хотеть ням-ням" или "она пошел дом" - примерно так это выглядит.
Можно ли в конструкцию copy (select 1,2,3 from table) to 'c:/file.txt' засунуть еще и преобразование типов to_char к столбцам 2 и 3 и как это будет выглядеть на языке SQL?

Ситаксис SQL очень хорошо

Ситаксис SQL очень хорошо описан в мануале в разделе Запросы:
http://postgresql.ru.net/manual/queries.html

copy (SELECT

copy (SELECT external_id,(to_char(coord_y,'99.999999')),(to_char(coord_x,'99.999999')) FROM object WHERE coord_y>0 AND coord_y>0 AND device_id=0 ORDER BY external_id) TO 'c:/install/coord1.txt'

Самое легкое - выгрузить - получилось в нужном мне виде.
Теперь перехожу ко второй части.
Это поиск строки, определение наличия в определенном поле в этой строке текстовых данных и если они есть - удаление определенного количества символов, а потом просто вставка нужного мне текста.
Растем потихоньку... :)

Может я что-то пропустил...

Может я что-то пропустил... Я нашел через position или strpos начало последовательности, которую мне нужно удалить. Я знаю, сколько символов мне надо удалить. Каким оператором?
Почитал, нашел только replace, которым можно воспользоваться, чтоб заменить субстроку.

Да всё проще. Вам ничего

Да всё проще. Вам ничего удалять не надо, просто выберите нужные вам символы из строки с помощью функции substring

Разрешите уточнение:

Разрешите уточнение: "Извлекает подстроку, совпадающую с регулярным выражением" - извлекает - разве означает, что в исходном столбце эта подстрока пропадет из строки?

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

Извлекает, означает, что это

Извлекает, означает, что это извлечение является результатом работы функции. А то из чего извлекали НИКОГДА функциями при использовании SELECT не меняется, оно меняется только при использовании UPDATE вместо SELECT

А если мне нигде не нужен

А если мне нигде не нужен кусок, который извлечет SUBSTRING? Могу ли я результат вставить в качестве параметра в REPLACE и заменить этот кусок в строке.... на ничто?

Понял, что можно... По

Понял, что можно... По неопытности думал, что если я оператору передам ничто в параметрах - он будет возмущаться.

Как к тексту в поле добавить

Как к тексту в поле добавить спецсимволы \r\n? Понятно, что через CONCAT, как сами символы обозначить? chr(182) - это оно?
Разобрался... chr(13)+chr(10)
Самое интересное - через CONCAT не захотело, сделал через || - заработало...

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023