博客从Emlog迁移至Typecho

365bet足球在线 2025-08-28 19:49:52 admin 访问量: 2329 评分: 896
博客从Emlog迁移至Typecho

这博客之前程序是emlog, 是很久以前搭的一个博客系统, emlog旧版本已经很久没更新了, 主题模板和插件也很少, 对markdown支持也比较差, wordpass太臃肿也不喜欢用。

看到个Typecho 挺不错的, 轻量级, 简洁, 今天就花了点时间从emlog迁移至Typecho了, 用的是joe的主题, 很舒服,尤其是代码高亮支持, 支持多种主题的代码高亮渲染

文章使用了emlog2typecho进行迁移,大体完美, 原代码有点问题, 稍微改了下

https://github.com/isaced/emlog2typecho

主题和插件资源https://typecho.me/

使用方法

在本地新建Emlog数据库并导入需要转换的数据再安装Typecho来建立Typecho的数据库在脚本中设置两个数据库名(默认是“emlog”和“typecho”)运行emlog2typecho.py备份Typecho数据库,上传到你的博客需要先安装mysql驱动

pip install MySQLdb迁移脚本

# Emlog 数据库名

emlog_database_name = 'emlog'

# Typecho 数据库名

typecho_database_name = 'typecho'

# 数据库地址

database_host = 'localhost'

# 数据库用户名

database_port = 3306

# 数据库用户名

database_user_name = 'root'

# 数据库用户名

database_user_password = 'root'

# 字符集

database_charset = 'utf8'

#################################################################################

import MySQLdb

# 连接数据库...

conn=MySQLdb.connect(host = database_host,

user = database_user_name,

passwd = database_user_password,

port = database_port,

charset = database_charset)

# 切换emlog数据库...

conn.select_db(emlog_database_name)

cur=conn.cursor()

# 读取emlog所有分类

cur.execute('select sid, sortname, alias, ( select count( * ) from emlog_blog where sortid = sid ) AS count FROM emlog_sort')

emlog_sort_list = cur.fetchall()

# 读取Emlog所有Tag

cur.execute('select tid,tagname,gid from emlog_tag')

emlog_tag_list = []

for row in cur.fetchall():

tagname = row[1]

gid_list = row[2].split(',')

# 移除列表中为空字符串的项

for gid in gid_list:

if gid == '':

gid_list.remove(gid)

# 组装

tag = {'tagname':tagname,'gidlist':gid_list}

emlog_tag_list.append(tag)

# 读取emlog blog表...

cur.execute('select gid,title,date,content,excerpt,alias,sortid,type,allow_remark from emlog_blog')

emlog_blog_list = cur.fetchall()

# 读取Emlog comment表

cur.execute("SELECT * FROM `emlog_comment`")

emlog_comment_list = cur.fetchall()

# ------------------------------------------

# --- Emlog表读取完毕,切换Typecho表进行写入 ---

# ------------------------------------------

# 切换Typecho数据库...

conn.select_db(typecho_database_name)

cur=conn.cursor()

# 删除Typecho 所有分类和标签...

cur.execute('delete from typecho_metas')

# 插入emlog所有分类

for sort in emlog_sort_list:

sort_id = sort[0]

sort_name = sort[1]

sort_sulg = sort[2] # sort[0] if sort[1] == '' else sort[1]

sort_count = sort[3]

cur.execute("insert into typecho_metas (mid, name, slug, type, description, `count`, `order`) VALUES (%s, %s, %s, 'category', NULL, %s, 0)" , (sort_id,sort_name, sort_sulg,sort_count))

# 删除Typecho 所有文章...

cur.execute('delete from typecho_contents')

# 删除文章所有关系

cur.execute('delete from typecho_relationships')

# 删除所有评论

cur.execute('delete from typecho_comments')

# 转移所有文章

for blog in emlog_blog_list:

print(blog)

blog_id = blog[0]

blog_title = blog[1]

blog_create_date = blog[2]

blog_content = blog[3]

blog_excerpt = blog[4]

# 不能为空字符串

blog_alias = blog[5]

if blog_alias == '':

blog_alias = None

# emlog --> blog page

# typecho --> post page

if blog[7] == 'blog':

blog_type = 'post'

else:

blog_type = 'page'

# allow comment

if blog[8] == 'y':

blog_allow_comment = '1'

else:

blog_allow_comment = '0'

params = (blog_id,blog_title,blog_alias,blog_create_date,blog_content,blog_type,blog_allow_comment)

cur.execute("insert into `typecho_contents` (`cid`, `title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, `template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, `allowPing`, `allowFeed`, `parent`) VALUES (%s, %s, %s, %s, NULL, %s, '0', '1', NULL, %s, 'publish', NULL, '0', %s, '0', '0', '0')",params)

# 添加文章的relationships

blog_sortid = blog[6]

# emlog 中 分类id -1 为页面

if blog_sortid == -1:

continue

cur.execute('insert into `typecho_relationships` (`cid`, `mid`) VALUES (%s, %s)',(blog_id,blog_sortid))

# 插入所有Tag(和关系)

cur.execute("select MAX( mid ) FROM `typecho_metas`")

sort_max_id = (cur.fetchall()[0][0]) + 1

# 从刚插入的分类最后一个ID+1作为ID开始循环插入

for tag in emlog_tag_list:

cur.execute("insert into `typecho_metas` (`mid`, `name`, `slug`, `type`, `description`, `count`, `order`) VALUES (%s, %s, %s, 'tag', NULL, %s, '0');",(sort_max_id,tag['tagname'],tag['tagname'],len(tag['gidlist'])))

for gid in tag['gidlist']:

params = (int(gid),sort_max_id)

# !有时会遇到重复项插入失败跳过

try:

cur.execute('insert into `typecho_relationships` (`cid`, `mid`) VALUES (%s, %s)',params)

except:

print('失败一条Tag:%s,%s' % (params))

sort_max_id = sort_max_id + 1

# 插入评论

for comment in emlog_comment_list:

params = (comment[0],comment[1],comment[3],comment[4],comment[6],comment[7],comment[8],comment[5],comment[2])

cur.execute("INSERT INTO `typecho_comments` (`coid`, `cid`, `created`, `author`, `authorId`, `ownerId`, `mail`, `url`, `ip`, `agent`, `text`, `type`, `status`, `parent`) VALUES (%s, %s, %s, %s, '0', '1', %s, %s, %s, NULL, %s, 'comment' , 'approved', %s)",params)

# 关闭数据库连接

cur.close()

conn.commit()

conn.close()

print('转移完成...')

相关数据

日记本重多少克
365bet足球在线

日记本重多少克

07-15 ↗ 5067
Master Lab 面膜
有人被365黑过钱吗

Master Lab 面膜

07-19 ↗ 2055
如何使用网页版微信? ➡️
36578130

如何使用网页版微信? ➡️

08-11 ↗ 6039
4月2日是什么星座
36578130

4月2日是什么星座

07-12 ↗ 3270
深圳市悠乐地带保健品有限公司
有人被365黑过钱吗

深圳市悠乐地带保健品有限公司

07-01 ↗ 8634
企业10大HR软件分析对比(精)
36578130

企业10大HR软件分析对比(精)

08-13 ↗ 565