py-скрипт
py-скрипт
Категория: Разработка Теги: Python , Веб-разработка Опубликовано: 3 ноября 2021

Перенос комментариев из 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.

Алексей Черемных
1641