-
思源笔记
22253 引用 • 88945 回帖
思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。
融合块、大纲和双向链接,重构你的思维。
-
Q&A
8076 引用 • 36887 回帖 • 162 关注
提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。
相关帖子
-
wilsons • • 2付费者 捐赠者
补充说明:
该贴不再维护,有需要的用户请移步至 批量导入文档到数据库 0.0.6 版全新发布
关于一键将所有子文档都添加到数据库中,今天我试着实现了这个功能。
代码如下
使用方法:
把上述代码粘贴到嵌入 SQL 代码块中即可(任意文件都可),即输入{{}}后在弹出的输入框中填入即可。
然后修改变量
docBlockId
为你要导入的父文档块 id,变量dbBlockId
为你要导入的数据库的块 id。变量docsSql
为你要查询的 SQL 语句逻辑,请根据实际情况修改,详情请看代码注释。然后,执行结果如下,然后重新打开或按 F5 刷新数据库所在页面即可查看到导入结果。
注意事项:
- 数据导入有风险,请做好备份工作再进行尝试。
- 数据量巨大时可能存在性能问题。
再次提醒!!!请在新空间测试无误后使用,使用前请做好备份!!!
- 其他回帖
-
- 光标问题,先确定是否脚本引起的问题,新空间测试排除干扰项。如果确定有问题,请给出问题的详细描述和重现步骤。另外,脚本已更新到 version 0.0.5,试试是否有问题。
- 关于排除后代文档问题,首先,这个脚本并没有限制导入的内容,导入的内容由你的 SQL 查询决定的,即可以是文档内容,也可以是其他等。这里,你要想实现只导入直接子文档,而不导入后代子文档的话,可以在 SQL 中添加查询条件
and (LENGTH(path) - LENGTH(REPLACE(path, '/', ''))) / LENGTH('/') <= 2
来实现,不过我在 0.0.5 版本中默认加了这个功能,所以,你只需要把变量 const maxLevel 设置为 2,即 const maxLevel = 2 即可。注意,这个层级是从父文档开始算 1 级,然后往后嵌套最大层级数。
再次重申,这个脚本具体导入数据库的内容,脚本并没限制,由你的 SQL 查询决定的,你可以导入任何你查询到的结果。
另外, @ONIONLYONE @chenhao5418 ,0.0.5 使用官方 api 插入文档到数据库,彻底解决了 0.0.2 中,文档名修改后数据库无法更新名称的问题,并且插入文档后能自动刷新数据库,不再需要手动刷新页面。
0.0.5 注意事项:
- 打开文档或刷新页面时默认不执行脚本,如果想要执行,把
runOnLoad
改为 true 即可 - 执行前弹出确认对话框,关闭的话,把
showConfirm
设为 false 即可 - 新增导入文档的排序方式,默认按照文档树里的顺序导入,如果想按 SQL 查询结果导入,把
sortByTreeOrder
设为 false 即可,该参数仅对导入文档有效,导入普通块无效。 - 新增导入文档的层级,默认 7 级,即从父文档 1 级,开始往下算,默认最大 7 级,如果想修改限制,修改
maxLevel
参数即可。 - 新增自定义备注,即当页面加载后,脚本上显示的提示文字,修改
memo
参数可自定义。 - 由于 0.0.5 抛弃了修改 json 的方式,使用官方 api 导入数据库,因此没有未知风险。但由于官方 api 没有统计成功和失败的文档数,因此结果只显示导入的文档数,不过一般不会失败,已导入的会忽略。
后续可能新增功能:
- 可以把修改过的代码保存为模板,下次直接通过斜杠命令 =》模板 =》你保存的模板名直接打开,不用再复制粘贴。
- 执行前的预览和确认
- 从模板加载时,可根据需要弹出输入文档块 id 和数据库 id 的输入框,然后执行完后删除嵌入块即可,适合临时使用。
1 回复 -
哈哈,感谢建议!先用着,做插件和解决问题复杂度完全不一样。
就像产品和 demo 的区别,要做成产品就要通用,完善,兼容好,体验好,持续维护等。
而,demo 或临时解决方案是针对某一问题的。
可能你花 10% 的时间就能解决问题,但如果要把解决方案做成产品要花 80% 以上甚至更多的时间才行。
而且,业余做插件不易,我之前曾在空闲和有兴趣的时候做过不少插件(非思源的),后来发现维护和精力是个难题。如果不维护感觉不负责,维护的话有时实在精力有限。
所以,我觉得如果业余做插件,精心维护好一两个就足矣,多了真应付不来,毕竟现在各类软件都升级很快,不维护,很快就各种问题了。
借着这个问题,突然想到了这些,说一下自己的浅见,不一定正确哈 😄 。
-
查询未加入数据库的文档,这个用普通的 SQL 是无法查询的,因为数据库中的文档在 sqlite 中并没有索引。
这个需要从数据库文件中读取插入的文档,然后在 SQL 查询中再排除这些文档就行了。
下面是个解决方案的示例,不知是否满足你的需求。
代码如下(链滴字数限制,只能把代码放到其他平台了):
使用方法:
将上述代码放到 SQL 块中即可,即输入{{}}后,在弹出的 SQL 输入框中输入即可。
代码说明:
这个示例也可以解决你问题修改前的那种查询方式,只需要把
and path like '/xxxx-xxxx%'
开启即可,如果不包含父文档自身,把and id != 'xxxx-xxxx'
开启即可,详情见代码注释说明。其实,这个查询方式的本质和正常查询没有任何区别,无非在最后加了排除数据库文档的条件罢了。
开启
formatByTitle(result);
,查询的结果是显示文档的标题,不开启查询的结果是显示文档的内容,思源默认的是显示文档的内容。另外,如果数据量巨大,这种方式可能存在性能问题,数据量巨大的情况下,最好的方法是提前对数据库内容做索引,由于方法复杂,如果有需求请自行研究实现。
效果如下:
开启 formatByTitle(result);结果
未开启 formatByTitle(result);结果
关于,一键将所有子文档都添加到数据库,目前只能通过 ctrl+ 点击多选,然后拖动到数据库里,其它应该尚未有更好办法吧,期待大佬们有更好解决方式!
或许可以通过修改数据库 json 的方式实现吧,但这样修改文件可能存在未知风险,你如果不在意的话倒是可以尝试下。
1 回复1 操作wilsons 在 2024-08-31 17:41:18 更新了该回帖 - 查看全部回帖