firefox的places.sqlite中标签的sql查询

x33g5p2x  于 2023-11-21  发布在  SQLite
关注(0)|答案(5)|浏览(234)

如何从Places. sqlite数据库中显示具有相同标签"press_germany"的书签。我使用SQLite管理器扩展以及SQLite软件的DB浏览器。我没有看到任何标签表,我不知道火狐是如何创建这些标签的。
所有我发现接近我的目标是在以下链接:
stackoverflowsuperuser.com.你是谁?
我尝试了此查询,但显示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架构(如果有帮助):Mozilla Developer The Places database

kpbpu008

kpbpu0081#

当你在Firefox中创建一个标签时,它会在moz_bookmarks中创建一个条目,其中title列将包含标签和fk(指向moz_places. id的外键。该标签下的任何书签都将有指向标签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语句中使用了第一个查询的结果(很像你做的-但是为那些可能不熟悉的人注解),并将其结果分配给别名'tag'(你可以选择任何你想要的别名,因为你可能知道,只是不要使用保留字或与字段名产生冲突)。
我怀疑你的最后一句话看起来像这样(如果不是,我很确定你将能够从那里调整它):

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;

icnyk63a

icnyk63a2#

我想我设法列出了我的“press_德国”标签。

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'

字符串
最后一件事:我想列出我的结果如下:{id - Name - Location}但我不知道如何获得“Name”列。MartinStettner's架构响应非常具有解释性。“Name”的值将在第一行的“title”字段中检索(stackoverflow)。请再次帮助。

x6yk4ghg

x6yk4ghg3#

注意:基于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)。
这里的关键是使用“self join”。我发现this tutorial可以帮助你学习这个概念并构建一个工作查询。在你的例子中,“FROM”子句将包含moz_places
至于评论中发布的查询:没有行匹配,因为它显式选择了fk = NULL的行,并且在moz_places中没有id = NULL的行。

a64a0gku

a64a0gku4#

我的目标是把对应于一个项目的标签放在一边备用,从而减轻我的书签(大约3000个标签有200000个书签,这表明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

字符串
感谢贡献者。

sg24os4d

sg24os4d5#

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

  • 在 * 搜索书签 * 中查找 oldtag
  • 选择所有找到的书签
  • 在标签中将 oldtag 编辑为 newtag
  • 按Enter

或sqlite:

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

验证码:

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 bookmarks tags places.sqlite

相关问题