如何显示 Places.sqlite 数据库中标记为“press_germany”的书签?我使用 SQLite 管理器扩展和 SQLite 数据库浏览器。
我没有看到任何标签表,也不知道 Firefox 如何创建这些标签。我发现的是:
我尝试了这个查询,但它显示 0 个结果:
SELECT moz_places.url, moz_places.title
FROM moz_places
LEFT OUTER JOIN moz_bookmarks
ON moz_places.id = moz_bookmarks.fk
WHERE moz_bookmarks.title = 'press_germany'
当您在 Firefox 中创建标签时,它会在 moz_bookmarks 中创建一个条目,其中标题列将包含标签和 fk(指向 moz_places.id 的外键)。该标签下的任何书签都将有 moz_bookmarks.parent 指向因此,您需要做的第一件事就是找到标签的 id。
SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL
通过包含 AND 语句,您可以确保命中标签。 如果它是一个实际的书签,fk 将有一个值。 我们不希望这样,我们希望 fk 为 NULL。
现在我们已经有了它,我们需要在查询中使用它。 您可以按如下方式操作:
SELECT moz_bookmarks.title
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
WHERE moz_bookmarks.parent == tag.id
请注意,在上面的查询中,我们在 FROM 语句中使用第一个查询的结果(很像您所做的 - 但为那些可能不熟悉这一点的人进行评论),并将其结果分配给别名“标签”(您可以选择您想要的任何别名,就像您可能知道的那样,只是不要使用保留字或与字段名称产生冲突)。
我怀疑你的最终陈述看起来像这样(如果不是,我很确定你可以从那里调整它):
SELECT moz_places.id, moz_bookmarks.title, moz_places.url
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
LEFT OUTER JOIN moz_places
ON moz_places.id == moz_bookmarks.fk
WHERE moz_bookmarks.parent == tag.id
上面不会做递归列表。 换句话说,如果文件夹中有子文件夹,子文件夹名称将在您的查询中列出,但不会列出其内容,包括子子文件夹。
如果您想递归地提取所有书签,这是我通过接受其他人的查询并对其进行调整而提出的查询。 除此之外,我不擅长递归查询。
WITH RECURSIVE
under_root(id, level) AS (
VALUES (0,0)
UNION ALL
SELECT moz_bookmarks.id, under_root.level+1
FROM moz_bookmarks JOIN under_root ON moz_bookmarks.parent=under_root.id
ORDER BY 2 DESC
)
SELECT substr('.....................................................................................................',1,level*5) || moz_bookmarks.title AS "TITLE", CASE WHEN moz_places.url is null THEN "" ELSE moz_places.url END AS "URL", datetime(moz_bookmarks.dateAdded/1000000,"UNIXEPOCH","LOCALTIME") AS "Date Added", datetime(lastModified/1000000,"UNIXEPOCH","LOCALTIME") AS "Last Modified", CASE WHEN datetime(moz_places.last_visit_date/1000000,"UNIXEPOCH","LOCALTIME") IS null THEN "" ELSE datetime(moz_places.last_visit_date/1000000,'UNIXEPOCH','LOCALTIME') END AS "Last Visit Date", CASE WHEN moz_places.visit_count IS null OR moz_places.visit_count=0 THEN "" ELSE moz_places.visit_count END FROM moz_bookmarks JOIN under_root ON moz_bookmarks.id=under_root.id LEFT JOIN moz_places on moz_places.id=moz_bookmarks.fk;
注意:基于 Firefox dev 63.0b6
更仔细地查看
moz_bookmarks
中的数据。具有标签标题的行中的 fk
是什么?
真正的线索在文档中[强调我的]:
moz_bookmarks:该表包含书签、文件夹、分隔符和标签,并定义层次结构。 层次结构是通过父列定义的,它指向作为父级的
记录。位置列对给定父级下的每个对等点进行编号,从 0 开始,每次添加时递增。 fk 列提供了 moz_places 中相应记录的 id 号。moz_bookmarks
这些表格被紧密引用,因此
join
似乎没有必要。你可以从FROM moz_places,moz_bookmarks tag, moz_bookmarks childs
--附录-->
您需要
moz_bookmarks
中互斥的两种“类型”行。 “标签”行,有标题和 ID,但 fk
为 NULL。 moz_bookmarks
中的“子”行具有与“标记”行的 parent_key
匹配的 id
和 fk
(这是 moz_places
中相应行的 id)。
这里的关键是使用“自连接”。我发现本教程可以帮助您学习这个概念并构建一个有效的查询。在您的情况下,“FROM”子句将包括
moz_places
。
关于评论中发布的查询:没有行会匹配,因为它显式选择带有
fk = NULL
的行,并且 moz_places 中没有带有 id = NULL
的行。
更新所有书签中的标签 您可以使用 Firefox > 库 窗口
或sqlite:
代码:
sqlite3> update moz_bookmarks
set parent = (select id from moz_bookmarks where title = 'new tag' and parent = 4) where
id in (select id from moz_bookmarks where
parent = (select id from moz_bookmarks where
title = 'old tag' and parent = 4));
这篇文章也可能有帮助:Firefox 书签标签places.sqlite
以前的答案无法检索书签的标题。
这就是我如何获取带有给定标签的每个书签的标题和网址(
press_germany
此处):
SELECT moz_bookmarks.title, place.url
FROM
( SELECT moz_places.id, moz_places.url
FROM moz_bookmarks, (SELECT moz_bookmarks.id from moz_bookmarks
WHERE moz_bookmarks.title == 'press_germany' AND moz_bookmarks.fk IS NULL) tag
LEFT OUTER JOIN moz_places
ON moz_places.id == moz_bookmarks.fk
WHERE moz_bookmarks.parent == tag.id) place
LEFT OUTER JOIN moz_bookmarks
ON moz_bookmarks.fk == place.id AND moz_bookmarks.title IS NOT NULL
请注意,标题位于
moz_bookmark
行,其中 title
是 NOT NULL
。
使用 Firefox 127 进行测试。
我想我成功列出了我的“press_germany”标签:
select * from(
SELECT x.id, x.title as Tag,z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z
WHERE x.id = y.parent and y.fk = z.id
)where Tag like 'press_germany'
我的目标是把与待命项目对应的标签放在一边,从而减轻我的书签(20万个书签约3000个标签,这表明firefox非常强大)。 我可以使用 DB Browser for SQLite 以 csv 格式导出这些标签,并获取 xlsx 文件。 这段代码非常适合我:只是标签的名称和位置。
select * from
( SELECT x.title as Tag, w.title as Name, z.url as Location
FROM moz_bookmarks x, moz_bookmarks y,moz_places z,moz_bookmarks w
WHERE x.id = y.parent and y.fk = z.id and w.fk = z.id )
where Tag == 'press_germany' and Name IS NOT NULL