Перенос комментариев из Joomla в Django
Раньше один из моих сайтов был на Joomla 3, но я его переписал на Django. Успешно перенёс все материалы, единственное, я принял решение переносить их вручную, так как хотел их переработать и исправить ряд ошибок. Давно хотел перебрать их и тут такая возможность. Работать руками я не боюсь, поэтому перебрать полторы тысячи материалов не страшно. Однако, при мысли о том, что нужно перенести ~4500 комментариев мне становилось страшно, и я этот вопрос откладывал в самый дальний ящик.
Согласен, это не правильный подход, и сложные задачи на самом деле решаются просто, главное сесть и начать делать, пусть маленькими шагами, но делать. Как говорится "Глаза бояться, а руки делают".
В общем, это всё лирическая часть нашего монолога, а пришло время практической части.
Сейчас любой хостинг предлагает PHPMyAdmin, при помощи которого можно экспортировать нужную таблицу в формате CSV. Если не знаете где они хранятся, то в случае использования компонента jcomments, используйте таблицу gh0u6_jcomments, где gh0u6 будет другим набором символов, который раскрывать нельзя (и я не раскрыл - заменил на другой). Это нужно для усложнения доступа к таблице злоумышленниками.
Таблицу с комментариями можно экспортировать в csv, а далее этот файл можно обработать при помощи Python. Покажу свой скрипт, при помощи которого я решил эту проблему. Сразу уточню, что в jcomments будут идентификаторы в качестве ссылок на материалы, и наверняка они будут соответствовать идентификаторам в новой базе. Я решил заменить их на названия материалов, так как они явно останутся прежними, либо поменяются лишь незначительно. Ближе к делу, экспортируем таким же образом еще и таблицу gh0u6_content.
Теперь сам скрипт:
import csv
csv_path2 = "jhk02d_content.csv"
title = {}
with open(csv_path2, encoding='utf-8') as f_obj:
reader = csv.DictReader(f_obj, delimiter=',')
for line in reader:
id = line['id']
stroka = line['title']
if stroka.find("-", 0, len(stroka)) >= 1:
n = stroka[stroka.find("-"):]
stroka = stroka.replace(n, '')
title[id] = stroka
print('Анализ закончен')
csv_path = "jhk02d_jcomments.csv"
data = []
with open(csv_path, encoding='utf-8') as f_obj:
reader = csv.DictReader(f_obj, delimiter=',')
i = 305
for line in reader:
f = line['object_id']
g = title[f]
line['object_id'] = g
i += 1
line['id'] = i
data.append(line)
print('Анализ закончен')
with open("123.csv", "w", newline='', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for line in data:
d = [line['id'], line['object_id'], line['username'],
line['email'], line['comment'], line['date']]
writer.writerow(d)
print('я закончил')
Скрипт довольно простой, в первой половине собираем заголовки и идентификаторы материалов и сохраняем их в словарь title, используя в качестве ключа идентификатор, а в качестве значения сам заголовок.
Во второй половине, как не трудно догадаться мы изучаем csv-файл с комментариями и записываем их 123.csv.
Все файлы должны лежать в одной папке.
Если нужны еще какие-то колонки из этих таблиц, добавьте их в переменную d в цикле for. В качестве разделителя использую запятую, поэтому для открытия итогового файла (если нужно) советую LibreOffice и указывать разделителем именно запятую, а не пробел.
По заголовку пару сотен идентификаторов вписать можно и руками. Далее остается лишь выставить колонки в нужном порядке, это также можно посмотреть в PHPMyAdmin, какой там порядок, такой и выставляйте тут. По итогу просто импортируем при помощи того же PHPMyAdmin.