Перенос работающего сайта WordPress с Mysql на PostgreeSQL

Задача: перенести рабочий, наполненный постами, сайт на движке WordPress с БД MySQL на PostgreeSQL

Инструментарий:

1) pgloader — утилита для переноса данных из баз данных MySQL в PostgreeSQL

Особенности о которые спотыкался:

  • для успешного переноса необходимо чтобы пользователь в терминале под которым осуществляется перенос имел максимальные права в БД и имел доступ «без пароля» для входа в консоль pgsql
  • при переносе создается схема с именем БД, а не заливается по умолчанию в схему public. Что в принципе для нашей ситуации даже будет плюсом.
  • Перед переносом, БД уже должна быть создана в PostgreeSQL

Синтаксис:

pgloader mysql://login:password@host/db_name pgsql:///db_name

2) Плагин PG4WP который на «лету» исправляет запросы к MySQL на PostgreeSQL

Особенности:

  • работает только при «чистой» установке. Т.е. WordPress должен быть штатно проинсталлирован с нуля
  • Инсталляция корректно работает только до версии WordPress 5.9
  • Плагин заброшен, последнее обновление — 3 года назад

Итак, общий алгоритм переноса рабочего WordPress получается такой:

  1. Переносим при помощи pgloader БД в отдельную схему
  2. Заново устанавливаем WordPress 5.9 с плагином PG4WP
  3. Удаляем из схемы public wp_posts (это если только статьи переносим) и переносим её из схемы созданной pgloader в public
  4. Пробуем обновить штатно WordPress

Точно понадобится:

-- перенос таблицы из отдной схемы в другую
ALTER TABLE wp_base.wp_users
SET SCHEMA public 

Удаление всех таблиц в схеме:

-- удаляем таблицы
DO $$ DECLARE
  r RECORD;
BEGIN
  FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
    EXECUTE 'DROP TABLE ' || quote_ident(r.tablename) || ' CASCADE';
  END LOOP;
END $$;
-- удаляем последовательности
DO $$ DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT relname FROM pg_class where relkind = 'S') LOOP
        EXECUTE 'DROP SEQUENCE IF EXISTS ' || quote_ident(r.relname) || ' CASCADE';
    END LOOP;
END $$;

Поменять схему всех таблиц:

DO $$ DECLARE
  r RECORD;
BEGIN
  FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'старая_схема') LOOP
    EXECUTE 'ALTER TABLE старая_схема.' || quote_ident(r.tablename) || ' SET SCHEMA новая_схема ';
  END LOOP;
END $$;

В принципе пока вполне рабочая схема

PostgreeSQL: ошибка вызова sha256 со значением столбца в качестве параметра

Функция sha256 создаёт хэш. Однако есть нюанс — в качестве входящего параметра она принимает тип bytea. Соответственно если вы вызовете что-то вроде:

select sha256('aa')

То результат будет получен. Однако при попытке выполнить что-то типа:

select sha256(txt) from users;

Получите ошибку вида:

ERROR:  function sha256(character varying) does not exist
LINE 1: select sha256(txt) from users;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883

Т.е. не соответствие типов. Как быть? На лету преобразуем тип текст в тип bytea:

select sha256(txt::bytea) from users;

Nodejs: Работа в Selenium с Yandex браузер

Отличия при работе с Chrome минимальные. Достаточно скачать подходящий драйвер и подключаться подобным образом:

  var service = new chrome.ServiceBuilder(binary_yandex_driver_file).build();
  chrome.setDefaultService(service);
  let driver = await new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();  

nmp — ошибка проверки самоподписанного сертификата

При установке модуля через nmp, иногда возникает ошибка вида:

reason: self-signed certificate in certificate chain

Причин возникновения её может быть множество. У меня например — из-за антивируса Касперского, который имеет свойство подпехивать свои сертификаты в промежуток трафика SSL. Что делать? Одним из решений может быть отключение у npm проверки подлинности SSL. Это конечно плохое решение, но в моём случае оказалось единственным вариантом

npm set strict-ssl false

Selenium: Запуск браузера хром в «скрытом» режиме

Аргумент запуска —headless хоть и работает, но многие сайты к сожалению работают в таком «скрытом» режиме не вполне корректно. Интернет говорит, что скорее всего дело в том, что браузер запускается с не понятным размером окна. Однако принудительное выставление размера, в моём случае не помогло. Решением оказалось запуск браузера «за пределами экрана». А именно что-то вроде:

chromeOptions.addArguments("--window-position=4000,0");
1 8 9 10 11 12 55