如何通过标签查询 Firefox 书签?

问题描述 投票:0回答:6

如何显示 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'

places.sqlite 架构

sql sqlite firefox bookmarks
6个回答
1
投票

当您在 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;

0
投票

注意:基于 Firefox dev 63.0b6

更仔细地查看

moz_bookmarks
中的数据。具有标签标题的行中的
fk
是什么?

真正的线索在文档中[强调我的]:

moz_bookmarks:该表包含书签、文件夹、分隔符和标签,并定义层次结构。 层次结构是通过父列定义的,它指向作为父级的

moz_bookmarks
记录。位置列对给定父级下的每个对等点进行编号,从 0 开始,每次添加时递增。 fk 列提供了 moz_places 中相应记录的 id 号。

这些表格被紧密引用,因此

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
的行。


0
投票

更新所有书签中的标签 您可以使用 Firefox > 库 窗口

  • 搜索书签中找到oldtag
  • 选择所有找到的书签
  • oldtag编辑为标签中的newtag
  • 按回车键

或sqlite:

  • 您需要更新引用该书签的所有条目的父项:
  • 新标签必须已定义
  • 不应有同时具有旧标签和新标签的条目
  • 这两个条件都可以在 Firefox > 库窗口中轻松配置

代码:

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


0
投票

以前的答案无法检索书签的标题。

这就是我如何获取带有给定标签的每个书签的标题和网址(

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 进行测试。


0
投票

我想我成功列出了我的“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'

0
投票

我的目标是把与待命项目对应的标签放在一边,从而减轻我的书签(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
© www.soinside.com 2019 - 2024. All rights reserved.