本文最后更新于:2024年1月14日 晚上

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

背景

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

下载 LeanCloud 备份数据

数据恢复

恢复思路

  • 一个正常的 MongoDB 数据库存储的评论为:
1
2
3
4
5
6
7
8
9
10
11
12
13
{'_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 下的数据为:
1
2
3
4
5
6
7
8
9
10
11
12
{"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 对应的数据库集合即可

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 做出的评论

MongoDB 数据迁移

补充一份 MongoDB 数据迁移的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pymongo import MongoClient
import mtutils as mt


#建立MongoDB数据库连接
conn1 = MongoClient('127.0.0.1',27017)
print(conn1.list_database_names())

mango_uri = 'mongodb://%s:%s' % ("127.0.0.1", 27017)
conn = MongoClient(mango_uri) # 创建链接
print(conn.list_database_names())
mydb = conn.admin

print(mydb.list_collection_names())

for collection_name in mt.tqdm(mydb.list_collection_names()):
collection = mydb[collection_name]

data_save = list(collection.find())
mt.pickle_save(data_save, 'data/' + collection_name + '.pickle')

参考资料



文章链接:
https://www.zywvvd.com/notes/hexo/theme/fluid/fluid-restore-walilne-comments/restore-walilne-comments/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

Fluid -26- 迁移 Waline LeanCloud 数据到本地
https://www.zywvvd.com/notes/hexo/theme/fluid/fluid-restore-walilne-comments/restore-walilne-comments/
作者
Yiwei Zhang
发布于
2022年9月1日
许可协议