[Web Development] Migrating DedeCMS to Discuz Portal

I recently needed to migrate from DedeCMS (dedecms) to Discuz Portal. The most important challenge was how to migrate categories and a large number of articles.

The database tables involved are:

  • dede_addonarticle - Article table
  • dede_arctype - Category table
  • dede_relation - Old-to-new category mapping table
  • pre_portal_article_content - Article content table
  • pre_portal_article_title - Article title table
  • pre_portal_article_count - Article view count table

1. Preprocess the old table, merge typename

1
2
3
UPDATE dede_addonarticle, dede_arctype 
SET dede_addonarticle.typename = dede_arctype.typename 
WHERE dede_arctype.id = dede_addonarticle.typeid;

2. Merge click, title, writer, pubdate, keywords, description

1
2
3
4
5
6
7
8
9
UPDATE dede_addonarticle, dede_archives  
SET 
    dede_addonarticle.click = dede_archives.click, 
    dede_addonarticle.title = dede_archives.title, 
    dede_addonarticle.writer = dede_archives.writer, 
    dede_addonarticle.pubdate = dede_archives.pubdate, 
    dede_addonarticle.keywords = dede_archives.keywords, 
    dede_addonarticle.description = dede_archives.description 
WHERE dede_archives.id = dede_addonarticle.aid;

3. Generate new IDs in relation

1
2
3
UPDATE dede_relation, pre_portal_category 
SET dede_relation.catid = pre_portal_category.catid 
WHERE dede_relation.new = pre_portal_category.catname;

4. Populate catid based on typename and relation

1
2
3
UPDATE dede_addonarticle, dede_relation 
SET dede_addonarticle.catid = dede_relation.catid
WHERE dede_addonarticle.typename LIKE CONCAT("%", dede_relation.olds, "%");

5. Import into Discuz Portal Tables

Insert into pre_portal_article_content (Article content table)

1
2
3
INSERT INTO pre_portal_article_content(aid, title, content, dateline) 
SELECT aid, title, body, pubdate AS dateline 
FROM dede_addonarticle;

Insert into pre_portal_article_title (Article title table)

1
2
3
INSERT INTO pre_portal_article_title(aid, username, title, author, summary, dateline) 
SELECT aid, 'admin', title, writer AS author, description AS summary, pubdate AS dateline 
FROM dede_addonarticle;

Insert into pre_portal_article_count (Article view count table)

1
2
3
INSERT INTO pre_portal_article_count(aid, cid, viewnum) 
SELECT aid, catid, click 
FROM dede_addonarticle;