在成功建立本地 Waline 服务后,需要考虑之前 Waline 数据迁移的问题了。
背景
- 国际版 LeanCloud 不能用了
- Vercel 不能用了
- 于是部署在 Vercel 上的 Waline 也不能用了
- 在 本地部署的 Waline 也就失去了之前的评论数据
- 需要将 LeanCloud 上的数据迁移到本地来
- 数据源为 LeanCloud ,目标为 MongoDB 数据库格式,相信其他数据库也是类似的方法
下载 LeanCloud 备份数据
- 参考 LeanCloud 数据继承
- 获取备份数据后,其中
Comment.0.jsonl
文件为评论数据库
数据恢复
恢复思路
- 一个正常的 MongoDB 数据库存储的评论为:
{'_id': ObjectId('6310577eb6b2b90cd6c84568'),
'comment': '评论测试 <img class="wl-emoji" src="https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo/weibo_clap.png" alt="weibo_clap"><img class="wl-emoji" src="https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo/weibo_clap.png" alt="weibo_clap">',
'insertedAt': datetime.datetime(2022, 9, 1, 6, 55, 58, 523000),
'ip': '180.171.132.122',
'link': 'https://www.zywvvd.com',
'mail': 'zywvvd@mail.ustc.edu.cn',
'nick': 'VVD',
'pid': None,
'rid': None,
'status': 'approved',
'ua': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
'url': '/notes/coding/internet/nginx-docker-https/nginx-docker-https/',
'user_id': '63104d1dcae126118b6109f3'}
- LeanCloud 下的数据为:
{"nick":"VVD","ip":"108.61.78.229",
"updatedAt":"2021-08-31T15:23:24.616Z",
"ACL":{"*":{"read":true,"write":true}},
"objectId":"612e496cdf64212dbbc96c97",
"mail":"zywvvd@mail.ustc.edu.cn",
"ua":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"insertedAt":{"__type":"Date","iso":"2021-08-31T15:23:24.126Z"},"createdAt":"2021-08-31T15:23:24.616Z",
"status":"approved",
"link":"www.zywvvd.com",
"comment":"<p>hello world !</p>\n",
"url":"/notes/hexo/theme/fluid/fluid-waline/fluid-waline/",
"user_id":"612e4539df64212dbbc967b1"}
- 对于我的目标和源数据库来说,核心差异在于
insertedAt
的值类型,只要将insertedAt
下的数据转化为 datetime.datetime 格式即可兼容 - 还有对于回复的评论,其内容中会有两个变量
pid
,rid
,这两个变量需要指向回复的变量_id
的 ID 内容,为了对其这项内容,将原始 objectId 命名 为当前 ID 即可 - 之后参考 Python 链接/操作 MongoDB 数据库 操作将数据添加进 Waline 对应的数据库集合即可
参考代码
代码语言:javascript复制from pymongo import MongoClient
import mtutils as mt
import json
from pprint import pprint
import datetime
import re
def time_format_transfer(time_info):
time_str = time_info['iso']
res = re.search("(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2}).(d{1,}).*", time_str)
res_list = [int(res[index]) for index in range(1, 8)]
time_obj = datetime.datetime(*res_list)
return time_obj
if __name__ == '__main__':
conn = MongoClient('127.0.0.1', 27017)
db = conn.admin
data_str_list = mt.file_read_lines('Comment.0.jsonl')[1:]
collenction = db['Comment']
for data_str in mt.tqdm(data_str_list):
info = json.loads(data_str)
res = time_format_transfer(info['insertedAt'])
info['insertedAt'] = res
pprint(info)
info['_id'] = bson.objectid.ObjectId(info['objectId'])
collenction.insert_one(info)
pass
修复效果
- 在博客文章的新 Waline 中可以看到之前以 LeanCloud 为后端时用户在 Waline 做出的评论
参考资料
- https://cloud.tencent.com/developer/article/2122048