我正在尝试在个人项目中读取 photos.db SQLite 数据库,该数据库是由 Mac OS 中包含的 Photos.app 生成的。
但是,我在结构上遇到了困难。我没有找到官方指南,所以我开始查看表结构并将数据与我在 Photos.app 中看到的数据进行比较。
读取专辑:这看起来很简单,或多或少是关于查询 RKAlbums 表。
SELECT * FROM RKAlbum WHERE RKAlbum.albumSubclass = 3 AND RKAlbum.isInTrash = 0
从相册中读取照片:看起来也很简单,所有内容或多或少都包含在表 RKMaster(照片)中,并且在 Stack Overflow 上进行一些挖掘是可以管理的。
SELECT * FROM RKMaster, RKVersion, RKAlbumVersion WHERE RKAlbumVersion.albumId = :album_id AND RKAlbumVersion.versionId = RKVersion.modelId AND RKVersion.masterId = RKMaster.modelId AND RKMaster.isInTrash = 0
读取人物/面孔:很简单,RKFace 和 RKPerson 表就可以了:
SELECT * FROM RKPerson WHERE `name` IS NOT NULL ORDER BY `name` ASC
SELECT * FROM RKFace `f`, RKMaster `m` WHERE f.personUuid = :person_id
结合面孔和照片:这是我开始感到困惑的时候。我有一张照片,可以在 Photos.app 中看到,也可以在 RKMaster 表中查询。在那张照片上,有一个人有一张脸,我也可以在 Photos.app 中看到它。但是,我在 RKFace.imageModelId 中找不到 RKMaster.modelId。反之亦然:RKFace.imageModelId 中有条目,但其中许多(不是全部)不在 RKMaster.modelId 中。
对如何存储数据有什么想法吗?我确信我缺少一些表来连接数据或其他东西。
这对我有用。
-- find people in a photo. specify photo name in where clause
select versions.*, persons.displayName, masters.imagePath from RKMaster masters
inner join RKVersion versions on versions.masterUuid = masters.uuid
inner join RKFace faces on faces.imageModelId = versions.modelId
inner join RKPerson persons on persons.modelId = faces.personId
where imagePath like '%P7251558.JPG';
以下是自 2019 年发布原始问题以来出现的一些有用的参考资料。它们包含 OP 问题的答案。
Osxphotos:[https://github.com/RhetTbull/osxphotos]
使用 SQL 根据 Apple Photos 找到我最好的鹈鹕照片: [https://simonwillison.net/2020/May/21/dogsheep-photos/]
dogsheep-照片:[https://github.com/dogsheep/dogsheep-photos]
Apple 照片数据库资源管理器:[https://github.com/lizdotsh/Apple-Photos-DB-Explorer]
Apple-photos-forensics:[https://github.com/muxcmux/apple-photos-forensics]
Photos.sqlite:[https://theforensicscooter.com/2021/11/23/photos-sqlite-queries/] 和:[https://dfir.pubpub.org/pub/v19rksyf/release/1]