Сконвертировать данные из Mysql Wordpress в Postrges

12
S3
На сайте с 29.03.2012
Offline
367
1187

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

Из старой базы меня интересуют 3 таблицы - wp-Post, wp-term и wp-term-relationship

в новой категории хранятся немного иначе

Задача примерно такая:

1. Из таблицы wp_posts взять post_title post_content post_name и добавить категорию из wp-term для каждого поста

2. Все это перенести в таблицу вида title content slug post_category - думаю тут очевидно,какие поля будут соответсвовать

Названия категорий будут храниться в связанной таблице category

Как это можно осуществить? Может нужно импорт через CSV? может примеры запросов для создания нужных таблиц и как это сохранять в CSV через консноль?

Хотя бы сама методология/алгоритм такого переноса?

S
На сайте с 23.05.2004
Offline
315
#1

Сделать скрипт, подключится к одной базе и писать в другую базу. Тем более, если нужны действия "взять отсюда, создать тут, добавить сюда".

Это просто подпись.
S3
На сайте с 29.03.2012
Offline
367
#2
Stek:
Сделать скрипт, подключится к одной базе и писать в другую базу. Тем более, если нужны действия "взять отсюда, создать тут, добавить сюда".

Просто гениальный совет, спасибо... А я все думаю - как???

SQL знания зачаточные совсем. Но за утро разобрался и смог собрать нужные мне данные из трех таблиц в одну, выкинув мусор. Теперь думаю как кошернее дальше.

Есть идея сконвертить данные в ХМЛ или Json и дальше обрабатывать их посредством Джанги. Как я понимаю Json - это уже готовый словарь, который бери о обрабатывай в Питоне?

S
На сайте с 23.05.2004
Offline
315
#3
Sly32:
SQL знания зачаточные совсем.

SELECT/UPDATE/INSERT по одной таблице - это вроде ну самый базовый уровень. Не представляю, куда уж меньше.

Sly32:
Есть идея сконвертить данные в ХМЛ или Json и дальше обрабатывать их посредством Джанги.

Это как гланды через задний проход удалять. Легче потратить 10-20 минут на составление (изучение) SQL запросов, чем воротить такую схему.

Честное слово, не понимаю в чем сложность из одной таблицы сделать "select a,b,c from table" а в другой раскидать по нужным полям через "insert into table (a,n,c) values(a,b,c)"

В любом случае для джанги придется делать то же самое, только в первой части придется читать json/xml, а во второй части присваивать значения объекту и сохранять его. Но при этом на вашу голову ляжет определение типов и их конвертация.

S3
На сайте с 29.03.2012
Offline
367
#4

Stek, Во-первых - не по одной таблице, тут главная сложность. В Вордпрессе данные по категориям храняться в 2-х таблицах, сам пост - в третьей, а тут ещеподумал, что неплохо бы выбрать данные из postmeta - там ссылки на картинки и дополнительные данные. Я собрал их в одну таблицу например, примерно таким запросом:



SELECT `term_taxonomy_id`, `object_id`, `slug`,`post_title`,`post_date`, `post_content`, `post_name`, `meta_key`, `meta_value` FROM `wp_rus_term_relationships`
INNER JOIN `wp_rus_terms`
ON `wp_rus_term_relationships`.`term_taxonomy_id` = `wp_rus_terms`.`term_id`
INNER JOIN `wp_rus_posts`
ON `wp_rus_posts`.`ID`= `wp_rus_term_relationships`.`object_id`
INNER JOIN `wp_rus_postmeta`
ON `wp_rus_term_relationships`.`object_id` = `wp_rus_postmeta`.`post_id` AND `wp_rus_postmeta`.`meta_key` = 'thumb'
WHERE `wp_rus_term_relationships`.`term_taxonomy_id`= 3

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

Но если сможете подсказать правильные запросы для postgres - буду благодарен

---------- Добавлено 01.05.2016 в 21:40 ----------

Stek:
Но при этом на вашу голову ляжет определение типов и их конвертация.

В том и дело что нет - джанга все сама сделает. С разбором хмл и чтением из файла я разобрался, там все изумительно организовано. но , я думаю, вы и сами знаете.

S
На сайте с 23.05.2004
Offline
315
#5
Sly32:
В том и дело что нет - джанга все сама сделает. С разбором хмл и чтением из файла я разобрался, там все изумительно организовано. но , я думаю, вы и сами знаете.

Не знаю, никогда не приходилось. Изредка приходилось парсить XML и втыкался в кучу проблем. Но возможно не так делал.

Sly32:
Получилась одна таблица.

Что в общем то и не правильно. Грубо говоря:

1. берем первую запись из поста - переносим в нужном виде

2.1 берем связанные теги этого поста - переносим

2.2 берем картинки этого поста - переносим

3. по циклу возвращаемся к пункту 1.

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

Sly32:
Но если сможете подсказать правильные запросы для postgres - буду благодарен

точно такой же синтаксис как и для mysql, при учете, что таблицы уже созданы.

W
На сайте с 09.04.2013
Offline
46
#6

Можно например так:

В mysql:


SELECT post_title, post_content,post_name
FROM wp_posts
INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

В postgres


CREATE TABLE post (post_title TEXT,post_content TEXT,post_name VARCHAR(200))


COPY post FROM '/path/to/file.csv' DELIMITER ',' CSV;
S3
На сайте с 29.03.2012
Offline
367
#7

webjey, Stek, Спасибо за советы, помогло вникнуть в суть.

Но все же решил пойти по пути использования Джанго для этого. Получается универсальный код.

Вот пример, просто чтоб сравнить как все выглядит по сравнению с мусклей или пхп)))


def get_context_data(self, **kwargs):
context = super(ImportView, self).get_context_data(**kwargs)
context['form'] = ImportForm
data = requests.get('http://rentalcar.loc/media/data.json').json()
url = "http://rentalcar.loc/media/test.txt"
for item in data:
newpost = BlogPost(language='ru', title= item['post_title'], slug=item['post_name'], created_at=item['post_date'], content=item['post_content'], announce=item['post_content'][:250], keywords='новости', status='publish', categories_id=8, author_id=1 )
try:
newpost.save()
except:
pass
return context
IW
На сайте с 16.12.2014
Offline
73
#8

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

Sly32:
просто чтоб сравнить как все выглядит по сравнению с мусклей или пхп)))

С какого места сравнивать?🍿

SSD VPS скидка 25% по купону iwork https://cp.inferno.name/cart.php?gid=23 | надежный хостинг http://bit.ly/2Yiq93h
S3
На сайте с 29.03.2012
Offline
367
#9

i-work, А мне в таком варианте не нужно по разным таблицам раскидывать. Не нужно для импорта лезть в консоль, могу в админке теперь загрузить json и тут же его импортировать в базу без лишних телодвижений))) все связи сами создадутся

Впрочем на вкус и цвет... Я нашел такое решение, оно меня более чем устраивает.

S
На сайте с 23.05.2004
Offline
315
#10

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

По хорошему весь импорт должен делаться в транзакции, а там где у вас "exept: pass" - должен быть откат транзакции, вывод ошибки и окончания действия импорта.

Это уже не говоря о том, что категорию и автора нельзя передавать по id. Их надо извлечь из базы и при отсутствии - создать.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий