Fluid -26- 迁移 Waline LeanCloud 数据到本地

2022-09-27 15:05:31 浏览数 (1)

在成功建立本地 Waline 服务后,需要考虑之前 Waline 数据迁移的问题了。

背景

  • 国际版 LeanCloud 不能用了
  • Vercel 不能用了
  • 于是部署在 Vercel 上的 Waline 也不能用了
  • 在 本地部署的 Waline 也就失去了之前的评论数据
  • 需要将 LeanCloud 上的数据迁移到本地来
  • 数据源为 LeanCloud ,目标为 MongoDB 数据库格式,相信其他数据库也是类似的方法

下载 LeanCloud 备份数据

  • 参考 LeanCloud 数据继承
  • 获取备份数据后,其中 Comment.0.jsonl 文件为评论数据库

数据恢复

恢复思路
  • 一个正常的 MongoDB 数据库存储的评论为:
代码语言:javascript复制
{'_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 下的数据为:
代码语言:javascript复制
{"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

0 人点赞