Type
Status
Date
Tags
Slug
Summary
Category
Password
✍️ Related to MyNotes
Icon
如何将自己的Notion笔记部分发表为博客,保护其余笔记的隐私性,即如何实现Notion数据库中部分数据与另一个数据库的同步。本文使用Make自动化工具,实现两个Notion数据库之间部分数据的可控同步,做为后续笔记管理的技术学习和探索。
1. 需求分析
要实现两个数据库的双向同步,即将Private DB中的部分记录及其更新同步到Public DB中,同样在Public DB中对记录所做的修改也能同步到Private DB中。
准备的数据库表如下:
- Private DB(待分享的数据库),包含以下属性(或字段)
字段名 | 类型 | 说明 |
Name | Title | 标题 |
Sample Description | Text | 该页面的描述 |
ID | Formula | 使用函数id()自动生成标记该记录的id |
Corresponding ID | Text | 存储将记录同步到Public DB后,在Public DB中的ID |
Sync? | Checkbox | 表示是否将该记录同步到Public DB中 |
- Public DB(同步的数据库,存储Private DB同步过来的数据)
字段名 | 类型 | 说明 |
Name | Title | 标题 |
Smaple Description | Text | 该页面的描述 |
ID | Formula | 使用函数id()自动生成标记该记录的id |
Corresponding ID | Text | 该记录在Private DB中的ID |
2. 技术路线及准备
采用Notion第三方Intergration 【Make】,读取Private DB中的Sync?状态,将Sync?为true的记录,属性值赋值到Public DB中。同样适用Make对Public DB中修改或新建的新记录属性值赋值给Private DB。
以下是Make的首页,它主要是通过可视化的界面从任务到系统实现自动化处理的工具,集成了Notion页面的修改查询等功能。
2.1. Make准备
- 登录点击【create a new scenario】
- 点击屏幕中间大的紫色按钮,添加第一个模块(moudle),搜索Notion并选择【Watch Database Items】(当数据库中记录创建或更新时触发)。说明:本例中该模块编号为1,实际中可根据个人创建顺序不同而产生变化,本处特标明编号是为了更好弄清楚后续各个模块之间的先后关系,具体的编号对功能实现无影响。
- 如果是第一次连接Make到Notion,点击上图中的【Add】,然后进行授权Make访问的Notion页面。确保使用的是【Public Connection】integration。
- 或者,也可以在所需要Make的Notion页面,点击右上角【…】然后在Connections中选择【Add connections】,然后选择【Make】。
3. 从Private DB到Public DB的同步
3.1. 思路分析
要实现所的功能,分为三个:
- 当Public DB中尚无对应记录时,如果Private DB中将Sync?设置为true时,在Public DB中新建记录,并将Private DB中对应记录字段的值(Name, Sample Description)复制到Public DB中
- 当Public DB中已经存在对应的记录。此时Private DB中字段值(Name, Sample Description)的修改,同步到Public DB中。
- 当Private DB中将Sync?设置为false并且Private DB中的Corresponding ID有值时,希望删除Public DB中对应的记录。
3.2. 具体实现
3.2.1. 在Public DB中创建新记录
- 在【Watch Database Items】模块后添加一个【Router,模块编号为2】(表示Path/路径的分支)。
- 在【Router】后添加第一条Path,并添加新的模块【Create a Database item,模块编号为3】(在数据库中创建新记录)。
- 在【Router】和【Create a Database item】之间的点线上,点击左键设置一个Filter【New Entry】,设置属性如下图所示(图中属性值前面的1表示Make中的模块编号)。该Filter的作用是当Private DB中Sync?为true并且Corresponding ID为空时,进行数据记录的创建,即模块3的功能。
- 模块3的属性设置如下,功能是将Private DB中Name、Sample Description和Corresponding ID字段的值分别赋给Public DB中对应的字段:
Private DB | Public DB |
Name | Name |
Same Description | Same Description |
ID | Corresponding ID |
- 接下来,要将Public DB中新记录的产生ID写到Private DB中的Corresponding ID中。实现为在【编号3】的后面添加一个新模块【Update Database items,编号为4】(更新一个已有的记录),设置如下:
3.2.2. 将Private DB中各字段的新值更新到Public DB对应的记录中
- 在模块2【Router】的后面添加第二条Path,添加一个新模块【Search Object, 编号为5】(搜索数据库、记录或者页面的对象),并在模块2与5之间的点线上添加一个Filter【Updated Record】,属性设置如下,该Filter作用为当Private DB中Sync?为true且Corresponding ID有值时,走这条路径:
- 编号5的属性设置如下,功能为搜索Public DB中Corresponding ID值与Private DB中ID相等的记录,该记录就是接下来待更新的记录:
- 在编号5模块的后面添加一个新模块【Update a Database items, 编号为6】,更新5号模块搜索到的记录,属性设置如下:
3.2.3. 当Private DB中的Sync?为false时,删除Public DB中对应的记录
- 在模块2后添加第三条路径,并添加新模块【Search Object, 编号为7】,在模块2和7之间添加新的Filter【Removed Entry】,该Filter的属性设置如下,功能为当Private DB中Sync?为false且Corresponding ID不为空时走这条路径:
- 模块7的属性设置如下,可以理解为搜索Public DB中Corresponding ID等于Private DB中ID的记录,该记录为待删除的记录:
- 在模块7后添加一个新模块【Delete a Page Content,编号为8】,属性值如下,删除模块7搜索到的Page:
- 最后,修改Private DB中对应的Corresponding ID的值,设置为null,方法为在模块8后面添加一个新模块【Update a Data Item,编号为9】,属性值设置如下:
3.2.4. Private DB同步到Public DB的整体模块流程图
4. 从Public DB到Private DB的同步
4.1. 一些修改
需要对Public DB数据库字段或属性进行修改,增加如下两个字段:
- Last edited by: 由Notion自动维护,记录上一次编辑的用户。
- User Update?: 类型为Formular,公式为:【prop("Last edited by") != "Make”】, 值为true时表示该记录上一次由非Make的人为编辑。
在Make中的【Scenarios】中点击【+Create a new scenario】。
4.2. 思路分析
- 搜索Public DB中由非Make用户(即为User Update?的为true)所做修改的所有记录。
- 当有记录时,判断Public DB中的Corresponding ID是否为空
- 如果不为空,表示Private DB中有对应的记录,将Public DB中所做的更新同步到Private DB
- 如果为空,表示Private DB中没有对应的记录(即当前记录由用户直接在Public DB中创建),需要在Private DB中新建对应的记录,并将Private DB新记录对应的ID存入到Public DB的Corresponding ID中。
4.3. 具体实现
4.3.1. 将Public DB已有记录的修改更新到Private DB中
- 在Public DB中搜索出User Update?为true的记录,在4.1新建的Scenario的页面中,添加第一个模块【Search Object, 编号为1】,其设置的属性如下:
- 添加一个【Router,编号为2】,开始分支。在模块1和Router之间,新建一个Filter【Exists?】,属性设置如下,该Filter的作用是:只有page id有效时才能接着执行后面的路径,这样是为了防止Public DB没有符合条件的记录时,执行出错:
- 在Router之后添加模块【Search Object, 编号为3】,作为第一条路径,并在2和3之间新建Filter【Existing Entry?】,该Filter的属性设置如下,表示目前该记录在Private DB中有对应的记录:
- 模块3的属性设置如下,表示在Private DB中找到了待更新的记录:
- 在Private DB中更新记录,即在模块3之后添加一个【Update a Database Item,编号4】,属性设置为:
4.3.2. 将Public DB中新建的记录更新到Private DB中
- 在Router之后添加第二条路径【Create a Database Item, 编号为5】,并在Router和5号模块之间添加新的Filter【New Entry】,该Filter的属性设置如下,将fallback route设置为true, 意思是router中其他路径都不匹配时(本例中就是在Private DB中没有与Public DB对应的记录时),走这条路径。
- 5号模块对应的属性设置为,表示根据Public DB中属性的值在Private DB中创建相同的记录,注意Sync?的值是要设置为true,因为这条记录已经在Public DB中了:
- 最终将Private DB中新建记录的ID记录到Public DB的Corresponding ID中。在模块5的后面添加一个新模块【Update a Database Item, 编号为6】,属性设置如下:
4.3.3. Public DB到Private DB同步的整体模块流程图
5. Private DB和Public DB双向同步
第3和第4部分分别用两个Scenarios实现了Private DB到Public DB,Public DB到Private DB的双向同步,如何安排这两个Scenarios,认真的读者可能发现,上述没有实现在Public DB中删除Private DB中已经同步的记录,因为我认为Private DB的优先级要高于Public DB。所以当安排两个Scenarios自动执行的时间时,我会将Private DB到Public DB的同步优先执行,比如安排在每一天凌晨4点执行,而另外一个安排在每一天凌晨5点执行。
6. 下一步
在本文中只实现了两个数据库记录的同步,在Notion数据库中每条记录又可以是一个Page,不仅有属性,还可以在该记录下创建内容。因此,目前两个数据记录的同步应用到实际中还不够理想。所以,下一步的工作是期望在此基础上实现两个数据库对应记录内页面内容的同步。一个类似的应用场景是,实现笔记数据库有效的、易控的分享与发布,比如将自己的部分笔记发布到个人博客,同时又能在Notion中统一管理笔记。
参考
数据库记录内page页面同步计划暂停
编辑于2023年8月10日:
原因如下:
- 利用Make能实现两个数据库项的同步,但无法实现数据库项page页面内容的同步。另外Make免费账户有使用次数的限制。
- 采用Notion API能初步实现除数据库项的同步外,还能实现page页面内容的同步。但目前存在尚无法解决的问题,如下:
- 同步的页面中block的数目最大只能100个,超出100个页面的page页面无法同步
- 同步的页面与原始页面的内容,block之间的顺序可以保持一致,但无法解决block之间的父子关系,即原始页面中父子block同步过来,变成了同层级的关系。原始在于传递给page创建函数的参数存在问题,目前尚未找到很好的解决方案。
- Notion自带的【sync code】虽然能实现page内容的同步,但必须要求原始数据库或所在的页面可共享。比如我想把笔记数据库中的笔记同步到博客所在的数据库,因为后者是共享的,那么必须要求笔记数据库也要是共享的。除非是反过来,把博客数据库的内容通过同步块的方式同步到笔记数据库。这也是目前我所采用的方法。
关于本文,您有什么想法,或者有什么好的办法解决Notion数据库中页面内容的同步,欢迎您评论交流。
- Author:Mr.Charley
- URL:https://blog.rahc.top/article/partly-share-notion-database
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts