【教程】飞牛OS相册数据迁移

  1. 1. 一、背景
  2. 2. 二、准备工作
    1. 2.1. 1. SSH连接正常
      1. 2.1.1. ① 打开ssh
      2. 2.1.2. ②尝试连接
    2. 2.2. 2. 停用相册或卸载相册
    3. 2.3. 3. 安装可以读取SQLite的工具
    4. 2.4. 4. 照片迁移与备份
  3. 3. 三、迁移方法
    1. 3.1. 1. 备份相册数据库
    2. 3.2. 2. 数据库修改
    3. 3.3. 3. 删除缓存文件
    4. 3.4. 4. 上传到新Nas的对应目录
    5. 3.5. 5. 安装相册
  4. 4. 四、故障回滚
  5. 5. 附录A:AI生成的数据库解释
    1. 5.1. 1. 阅读说明
      1. 5.1.1. 1.1 时间字段
      2. 5.1.2. 1.2 表之间的关联
      3. 5.1.3. 1.3 布尔与枚举字段
      4. 5.1.4. 1.4 空间扩展表
    2. 5.2. 2. 核心数据关系
    3. 5.3. 3. 核心业务表
      1. 5.3.1. user
      2. 5.3.2. device
      3. 5.3.3. photo
      4. 5.3.4. user_photo
      5. 5.3.5. user_folder
      6. 5.3.6. user_album
      7. 5.3.7. album_user_photo
      8. 5.3.8. album_condition
      9. 5.3.9. user_album_grant
      10. 5.3.10. user_tag
      11. 5.3.11. user_photo_tag
      12. 5.3.12. user_photo_category
      13. 5.3.13. person
      14. 5.3.14. face
      15. 5.3.15. face_task_log
      16. 5.3.16. folder_cover
      17. 5.3.17. address_task
      18. 5.3.18. repeat_photo
      19. 5.3.19. recycle_bin
      20. 5.3.20. file_task
      21. 5.3.21. err_item_log
      22. 5.3.22. google_takeout_log
      23. 5.3.23. share_link
      24. 5.3.24. user_config
      25. 5.3.25. sys_config
      26. 5.3.26. data_version
      27. 5.3.27. db_version
      28. 5.3.28. data_licenses
    4. 5.4. 4. SpatiaLite 空间扩展表
      1. 5.4.1. geometry_columns
      2. 5.4.2. geometry_columns_auth
      3. 5.4.3. geometry_columns_field_infos
      4. 5.4.4. geometry_columns_statistics
      5. 5.4.5. geometry_columns_time
      6. 5.4.6. spatial_ref_sys
      7. 5.4.7. spatial_ref_sys_aux
      8. 5.4.8. idx_photo_geom
      9. 5.4.9. idx_photo_geom_node
      10. 5.4.10. idx_photo_geom_parent
      11. 5.4.11. idx_photo_geom_rowid
      12. 5.4.12. views_geometry_columns
      13. 5.4.13. views_geometry_columns_auth
      14. 5.4.14. views_geometry_columns_field_infos
      15. 5.4.15. views_geometry_columns_statistics
      16. 5.4.16. virts_geometry_columns
      17. 5.4.17. virts_geometry_columns_auth
      18. 5.4.18. virts_geometry_columns_field_infos
      19. 5.4.19. virts_geometry_columns_statistics
      20. 5.4.20. ElementaryGeometries
      21. 5.4.21. KNN
      22. 5.4.22. SpatialIndex
      23. 5.4.23. spatialite_history
      24. 5.4.24. sql_statements_log
    5. 5.5. 5. 主要数据库视图
    6. 5.6. 6. 修改数据库时的注意事项

一、背景

飞牛OS是目前无需”黑“就能实现多种专业功能,好用且免费的Nas系统,但是如果需要迁移Nas,从一台换到另一台,飞牛官方暂未给出合适的解决方案。尤其是对于相册等应用的数据,相册中的AI识别数据、图像位置数据、相册分类数据等十分珍贵,迁移后需要重新构建并不方便,在此背景下,本文提出了一种近乎无损的方法,直接修改和迁移数据库文件,让迁移数据不再麻烦。

本流程可用性已由本人亲自测试,下面步骤为本人迁移时完成,迁移目标机器的fnOS版本为1.2.0203,相册版本为0.9.7,本文只确定在此版本下能正常工作,修改系统文件有风险,请确保自己有承担风险的能力和基本计算机知识,最好有Linux方面知识请提前备份数据,如出现数据丢失等问题,本人概不负责

二、准备工作

1. SSH连接正常

由于本文的方法需要处理系统级文件,在图形界面无法查看,因此需要使用ssh连接到Nas,请确保ssh为打开状态,并保证能连接,本文使用Xshell作为连接ssh的连接工具,也可以选择其它工具甚至直接使用windows子带的ssh,选择Xftp作为文件传输方式,没有该文件传输方式也可以将需要修改备份的文件放到存储空间内下载。下面为ssh连接的步骤。

① 打开ssh

在飞牛的 系统设置 - SSH - SSH功能,将ssh开关打开,并记住端口(默认22),并在下方的用户权限处确保管理员具有访问SSH的权限。

开启ssh功能

②尝试连接

在Xshell中新建连接,按下图提示输入相应连接信息。

在Xshell中输入连接信息

输入信息后点击用户身份验证,然后输入用户名和密码,用户名和密码同Nas的管理员登录用户名和密码,具体如下图所示。

输入用户名和密码

然后点击连接即可,连接后会将信息自动保存,下次无需再次输入。看到是否接受选择永久接受即可。

注意,这里原Nas和新Nas都应该连接才行。

2. 停用相册或卸载相册

原Nas中将相册停用,新Nas若安装也要停用,最好是卸载,本文中新的Nas还未安装相册,因此仅需要将原Nas中的相册停用即可。可在应用中心 - 已安装 - 相册中选择停用。如果你要卸载,请选择保留数据卸载。

停用或卸载相册后,才能确保数据库不会再被读取,新Nas安装后,相册会以为以前安装过,数据还留在Nas上。

3. 安装可以读取SQLite的工具

可以安装Navicat或SQLiteStudio作为读取sqlite文件的工具。由于Navicat收费,本文选择了SQLiteStudio。安装方法非常简单,也可参考其它文档,本文不再赘述。

4. 照片迁移与备份

请将照片先迁移到新Nas的对应位置,并至少留一份备份以防止相册出现损坏。

(建议备份多做,数据保存应当做到3个备份2个不同介质1个异地备份,本人适应移动硬盘进行不同介质备份,后续文件增大可能会入手数据磁带,同时使用阿里云和百度云作为异地备份,文件加密后上传到网盘。)

三、迁移方法

1. 备份相册数据库

备份整个相册数据目录,如出现问题方便数据回滚。为方便操作,这里进入root用户进行操作,命令如下,运行该命令后需要根据提示输入密码,这里输入的不是root的密码,而是登录用户的密码,root用户权限极高,甚至能将系统本身删除,因此不建议长期使用root操作。

1
sudo -i

首先进入应用数据文件夹:

1
cd /usr/local/apps/@appdata/

相册的数据库文件夹就在该文件夹下的trim.photos文件夹,再旧Nas中,使用如下命令备份:

1
tar -zcvf backup_$(%Y%m%d_%H%M%S).tar.gz trim.photos/

这会生成一个名称为 backup_20260721_092340.tar.gz的文件,后面的串数字是日期和时间,根据实际情况变动,请使用ll命令查看你自己的文件。得到备份文件后,将该文件下载到本地电脑,可以使用Xftp,也可以将其移动到存储空间后下载。(下载方式没什么可讲的,都是计算机常识,都玩Nas了还不会的话应该自己上网搜索)

2. 数据库修改

下载文件后解压,使用WinRAR等工具均可解压,解压后找到trim.photos/db/photo.db,这是飞牛相册主数据库,使用SQLiteStudio打开。打开后如下所示。

飞牛相册主数据库

附录里有数据库的详细规则,可以不用看以为没必要,数据能不改就别改。双击photo表,跳转到数据,可以在右侧看到一个表格如下图所示。

photo表

由于本人从旧的机器的vol2迁移到新的vol2,为了模拟路径变动,因此本人在旧机器的vol1中也创建了一些照片和视频,并迁移后放在了vol2的目录下,还修改了部分路径。

这里在上方搜索框搜到vol1,结果如下,我希望视频放到/vol2/1000/Photos/photo videos/2026下,图片放到/vol2/1000/Photos/other pictures/下,需要修改file_path的目录部分和file_dir

vol1中的视频和图片

选择新建sql文件,使用下面命令批量修改。每个UPDATE命令修改一套文件夹变动。

1
2
3
4
5
6
7
UPDATE photo
SET file_path = REPLACE(file_path, '/vol1/1000/Photos2/MobileBackup/Xiaomi 24129PN74C/', '/vol2/1000/Photos/other pictures/'),
file_dir = REPLACE(file_dir, '/vol1/1000/Photos2/MobileBackup/Xiaomi 24129PN74C/', '/vol2/1000/Photos/other pictures/');

UPDATE photo
SET file_path = REPLACE(file_path, '/vol1/1000/Photos2/PhotoLibrary/2026/4/', '/vol2/1000/Photos/photo videos/2026/'),
file_dir = REPLACE(file_dir, '/vol1/1000/Photos2/PhotoLibrary/2026/4', '/vol2/1000/Photos/photo videos/2026');

这样数据库就修改好了。除此之外,还需要修改相册的存储卷数据,在表user_folder中,可以直接删除这个表中的数据(注意不是删除表),使用下面的sql语句。

1
DELETE FROM user_folder;

运行sql语句时,记得观察有无报错,是否正常进行,如果使用图形界面编辑数据库,记得手动点击提交。

3. 删除缓存文件

删除photo.db同目录下的photo.db-shmphoto.db-wal文件。

4. 上传到新Nas的对应目录

可以打包后上传,也可以直接整个文件夹传上去,具体方式可以自己选择。

我这里直接上传到vol2下,使用下面命令移动到对应目录。

1
mv /vol2/1000/trim.photos /usr/local/apps/@appdata/trim.photos

5. 安装相册

到应用商店重新安装飞牛相册,进入相册后选择对应备份相册文件夹后即可。记得安装之前安装过的人脸模型和只能识别模型。进入设置,找到偏好设置,维护工具,任务名称选择重建索引,重新生成缩略图,清理垃圾数据,都执行一遍。

四、故障回滚

如果出现错误,使用此命令回滚恢复数据库

1
2
rm -rf trim.photos/
tar -zxvf 备份的文件名.tar.gz

附录A:AI生成的数据库解释

本附录根据飞牛相册 SQLite 数据库导出的 SQL 结构整理,主要用于数据研究、备份恢复和二次开发参考。

字段含义由 SQL 注释、字段命名、索引及表间关系综合推断,并非飞牛官方数据库文档。对于 SQL 中没有给出枚举或单位的字段,本文会明确标注“具体含义未声明”。


1. 阅读说明

1.1 时间字段

数据库中大量使用 INTEGER 保存时间,例如:

  • created_at
  • updated_at
  • mod_time
  • delete_at
  • last_heartbeat

它们通常是 Unix 时间戳,但 SQL 结构没有统一说明使用秒、毫秒还是其他精度。实际处理前,建议先抽取几条数据进行验证。

1.2 表之间的关联

SQL 导出文件中执行了:

1
PRAGMA foreign_keys = off;

而且多数业务表并没有显式声明外键。因此,本文所写的关联关系主要根据字段名和索引推断。

1.3 布尔与枚举字段

以下类型字段通常使用整数表示状态:

  • status
  • source
  • shared
  • deleted
  • is_live
  • is_collect
  • special_type

除 SQL 中已有注释的字段外,具体枚举值不能仅凭数据库结构确定。

1.4 空间扩展表

数据库包含大量 SpatiaLite 表和虚拟表,例如:

  • geometry_columns
  • spatial_ref_sys
  • idx_photo_geom
  • SpatialIndex
  • KNN

这些对象主要用于照片 GPS 坐标、地图查询和空间索引,一般不建议手动修改。


2. 核心数据关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
erDiagram
USER ||--o{ DEVICE : owns
USER ||--o{ USER_PHOTO : owns
PHOTO ||--o{ USER_PHOTO : maps
USER ||--o{ USER_ALBUM : creates

USER_ALBUM ||--o{ ALBUM_USER_PHOTO : contains
USER_PHOTO ||--o{ ALBUM_USER_PHOTO : belongs_to

USER_ALBUM ||--o{ ALBUM_CONDITION : filters
USER_ALBUM ||--o{ USER_ALBUM_GRANT : grants

USER_PHOTO ||--o{ USER_PHOTO_TAG : tagged
USER_TAG ||--o{ USER_PHOTO_TAG : applies

USER_PHOTO ||--o{ USER_PHOTO_CATEGORY : classified

USER_PHOTO ||--o{ FACE : contains
PERSON ||--o{ FACE : groups

USER_PHOTO ||--o| RECYCLE_BIN : deleted_to
USER_PHOTO ||--o| REPEAT_PHOTO : deduplicated

核心结构可以简单理解为:

  • photo 保存磁盘上的实际媒体文件信息。
  • user_photo 保存媒体文件在某个用户相册空间中的实例。
  • user_album 保存相册。
  • album_user_photo 连接相册和用户照片。
  • face 保存照片中检测到的人脸。
  • person 将多个人脸聚合为同一个人物。
  • user_taguser_photo_tag 负责标签系统。

3. 核心业务表

user

用户与 NAS 用户账户的映射表。

字段 类型 含义
id INTEGER 用户表主键,自增。
nas_uid INTEGER NAS 系统中的用户编号,存在唯一索引。
created_at INTEGER 用户记录创建时间。
updated_at INTEGER 用户记录最后更新时间。

device

记录用户设备和设备备份目录。

字段 类型 含义
id INTEGER 设备记录主键,自增。
user_id INTEGER 设备所属用户,通常关联 user.id
device_id TEXT 设备在业务系统中的标识。
device_name TEXT 设备显示名称。
device_uniq_name TEXT 设备唯一名称或用于去重的名称。
created_at INTEGER 设备记录创建时间。
updated_at INTEGER 设备记录最后更新时间。
backup_path TEXT 设备照片的备份目录。
oem_device_id TEXT 设备厂商或 OEM 提供的设备标识。

user_id + device_id 上存在唯一索引,说明同一用户下不能重复登记相同设备。


photo

照片库最核心的资源表,保存磁盘文件、EXIF、尺寸、哈希、GPS 和动态照片信息。

photo 表代表底层媒体资源;用户看到的照片实例主要由 user_photo 表表示。

字段 类型 含义
id INTEGER 照片资源主键,自增。
file_path TEXT 媒体文件完整路径,存在唯一索引。
file_dir TEXT 媒体文件所在目录。
date_time TEXT 拍摄时间或创建时间的原始文本。
file_type TEXT 文件格式、扩展名或 MIME 类型标识。
category TEXT 媒体大类或文件分类。
model TEXT 拍摄设备型号,对应 EXIF Model
fumber TEXT 光圈值,字段名疑似历史拼写,原意可能是 FNumber
exposure_time TEXT 曝光时间,对应 EXIF ExposureTime
ISO_speed_ratings TEXT ISO 感光度,对应 EXIF ISOSpeedRatings
focal_length TEXT 拍摄焦距,对应 EXIF FocalLength
file_size INTEGER 当前媒体文件大小,通常以字节计。
width INTEGER 媒体宽度,通常以像素计。
height INTEGER 媒体高度,通常以像素计。
make TEXT 拍摄设备制造商,对应 EXIF Make
exposure_program TEXT 曝光程序,对应 EXIF ExposureProgram
metering_mode TEXT 测光模式,对应 EXIF MeteringMode
flash TEXT 闪光灯信息,对应 EXIF Flash
geo TEXT 旧版或辅助地理信息文本。
file_name TEXT 文件名,不包含或可能不包含完整目录。
uuid TEXT 媒体资源 UUID。
media_duration INTEGER 视频或动态媒体时长,单位未在 SQL 中声明。
latitude TEXT 纬度文本值。
longitude TEXT 经度文本值。
country_code TEXT 国家或地区代码。
city TEXT 城市名称。
file_hash TEXT 当前文件哈希,用于校验或去重。
live_photo_video_index INTEGER Live Photo 配套视频的索引或关联标记。
content_identifier TEXT 动态照片中图片与视频的内容配对标识。
angle INTEGER 媒体旋转角度。
has_thumbnail INTEGER 是否已经生成缩略图的状态标记。
created_at INTEGER 资源记录创建时间。
updated_at INTEGER 资源记录最后更新时间。
original_size INTEGER 原始媒体文件大小。
motion_type INTEGER 动态照片或运动媒体类型,具体枚举未声明。
original_hash TEXT 原始文件哈希。
mod_time INTEGER 文件最后修改时间。
geom POINT SpatiaLite 点坐标,用于地图和空间索引查询。
gps_standard INTEGER GPS 坐标标准或来源标记,默认值为 0
time_zone_offset INTEGER 拍摄时间对应的时区偏移,单位未声明。
special_type TINYINT 特殊媒体类型标记,默认值为 0

user_photo

媒体资源在某个用户空间中的实例表。

同一个底层 photo 记录,理论上可以对应不同用户的 user_photo 记录。

字段 类型 含义
id INTEGER 用户照片主键,自增。
photo_id INTEGER 底层媒体资源 ID,通常关联 photo.id
user_id INTEGER 照片所属用户,通常关联 user.id
description TEXT 用户为照片设置的描述。
is_collect INTEGER 是否收藏。
date_time TEXT 用于用户时间线展示和排序的时间。
year INTEGER 时间线年份。
month INTEGER 时间线月份。
day INTEGER 时间线日期。
source TEXT 照片进入用户图库的来源。
live_video_id INTEGER 动态照片配套视频的关联记录 ID。
created_at INTEGER 用户照片记录创建时间。
updated_at INTEGER 用户照片记录最后更新时间。
is_live INTEGER 是否为 Live Photo 或动态照片。
time_zone_offset INTEGER 时间线所使用的时区偏移。

user_folder

记录用户纳入照片管理和扫描范围的目录。

字段 类型 含义
id INTEGER 目录记录主键,自增。
user_id INTEGER 目录所属用户。
folder_path TEXT 被纳入照片管理的目录路径。
status INTEGER 目录扫描或启用状态,具体枚举未声明。
is_default INTEGER 是否为默认照片目录。
deleted INTEGER 逻辑删除标记。
created_at INTEGER 目录记录创建时间。
updated_at INTEGER 目录记录最后更新时间。

user_album

用户相册信息表。

字段 类型 含义
id INTEGER 相册主键,自增。
name TEXT 相册名称。
user_id INTEGER 相册所属用户。
poster_photo_id INTEGER 相册封面对应的底层照片 ID。
shared INTEGER 相册是否处于共享状态。
source TEXT 相册来源或创建方式。
created_at INTEGER 相册创建时间。
updated_at INTEGER 相册最后更新时间。
name_pinyin TEXT 相册名称拼音,用于搜索或排序。
poster_album_user_photo_id INTEGER 相册封面在 album_user_photo 中的关联记录 ID,按字段名称推断。
mod_time INTEGER 相册内容或相册信息修改时间。
share_mod_time INTEGER 相册共享信息最后修改时间。
category INTEGER 相册类别,具体枚举未声明。
display_type INTEGER 相册展示类型,具体枚举未声明。
birthday TEXT 生日相册或人物相册相关日期。

同一用户下的相册名称存在唯一索引:

1
user_id + name

album_user_photo

相册与用户照片的多对多关联表。

字段 类型 含义
id INTEGER 关联记录主键,自增。
album_id INTEGER 相册 ID,通常关联 user_album.id
user_photo_id INTEGER 用户照片 ID,通常关联 user_photo.id
source TEXT 照片进入相册的来源或添加方式。
created_at INTEGER 关联创建时间。
updated_at INTEGER 关联最后更新时间。

数据库分别对以下组合建立了唯一索引:

1
2
album_id + user_photo_id
user_photo_id + album_id

用于防止同一张照片被重复加入同一相册。


album_condition

条件相册或智能相册的筛选条件。

一条记录可以通过目录、标签或人物定义相册内容。

字段 类型 含义
id INTEGER 条件记录主键,自增。
album_id INTEGER 条件所属相册 ID。
related_folder_path TEXT 作为相册筛选条件的目录路径。
related_tag_id INTEGER 作为筛选条件的标签 ID。
created_at INTEGER 条件创建时间。
related_person_id INTEGER 作为筛选条件的人物 ID。
add_user_id INTEGER 添加该条件的用户 ID。

数据库分别限制同一相册不能重复添加相同目录、人物或标签条件。


user_album_grant

相册授权和访问权限表。

字段 类型 含义
id INTEGER 授权记录主键,自增。
album_id INTEGER 被授权相册的 ID。
type TEXT 授权目标类型,例如用户或其他对象;具体值未声明。
permission TEXT 授权权限文本。
target_id INTEGER 授权目标 ID。
created_at INTEGER 授权创建时间。
updated_at INTEGER 授权最后更新时间。

user_tag

用户标签表。

字段 类型 含义
id INTEGER 标签主键,自增。
user_id INTEGER 标签所属用户。
name TEXT 标签名称。
use_time INTEGER 标签最近使用时间或累计使用信息,精确含义未声明。
created_at INTEGER 标签创建时间。
updated_at INTEGER 标签最后更新时间。

同一用户下的标签名称必须唯一。


user_photo_tag

用户照片与标签的关联表。

字段 类型 含义
id INTEGER 关联记录主键,自增。
user_photo_id INTEGER 用户照片 ID。
tag_id INTEGER 标签 ID,通常关联 user_tag.id
created_at INTEGER 标签关联创建时间。
updated_at INTEGER 标签关联最后更新时间。

user_photo_category

AI 图像分类结果表。

字段 类型 含义
id INTEGER 分类记录主键,自增。
user_photo_id INTEGER 被分类的用户照片 ID。
category_name TEXT AI 识别出的细分类名称。
distance REAL 分类模型计算出的距离或相似度度量。
main_category_name TEXT 细分类所属的主分类名称。
user_id INTEGER 分类结果所属用户。
created_at INTEGER 分类记录创建时间。
updated_at INTEGER 分类记录最后更新时间。

distance 越大还是越小代表越相似,需要结合飞牛实际使用的模型判断。


person

人物聚类表,用于“人物”或“人脸相册”功能。

字段 类型 含义
id INTEGER 人物主键,自增。
user_id INTEGER 人物所属用户。
name VARCHAR(255) 人物名称。
birthday DATE 人物生日。
poster_face_id INTEGER 作为人物封面的推荐人脸 ID。
status TINYINT(1) 人物状态:0 为正常,1 为隐藏。
updated_at INTEGER 人物记录最后更新时间。

face

照片中的人脸检测结果。

字段 类型 含义
id INTEGER 人脸记录主键,自增。
user_photo_id INTEGER 包含该人脸的用户照片 ID。
user_id INTEGER 人脸数据所属用户。
bbox TEXT 人脸边界框,使用逗号分隔的像素坐标。
relative_bbox TEXT 归一化后的人脸边界框,使用比例坐标。
person_id INTEGER 人脸聚类所属的人物 ID;默认 0 通常表示尚未归类。
source INTEGER 人脸人物归属来源:0 为自动,1 为手动。

face_task_log

人脸识别或人脸检测任务记录。

字段 类型 含义
id INTEGER 任务记录主键,自增。
user_photo_id INTEGER 被提交或已经处理的人脸任务照片 ID。
user_id INTEGER 任务所属用户。

folder_cover

目录自定义封面表。

字段 类型 含义
id INTEGER 封面记录主键,自增。
folder_path TEXT 目录路径。
user_photo_id INTEGER 被设置为目录封面的用户照片 ID。

address_task

照片地址或地理位置解析任务表。

可能用于根据 GPS 坐标进行地址反向解析,或补全照片的经纬度信息。

字段 类型 含义
id INTEGER 地址任务主键,自增。
photo_id INTEGER 待处理照片资源 ID。
latitude TEXT 纬度。
longitude TEXT 经度。
created_at INTEGER 任务创建时间。
updated_at INTEGER 任务最后更新时间。

repeat_photo

重复照片识别结果表。

字段 类型 含义
id INTEGER 重复照片记录主键,自增。
user_id INTEGER 记录所属用户。
user_photo_id INTEGER 重复照片对应的用户照片 ID。
group_id INTEGER 重复照片分组 ID。
keeped INTEGER 是否被选为保留项的标记,字段名为历史拼写。

user_photo_id 存在唯一索引,说明一张用户照片只能属于一个重复照片记录。


recycle_bin

照片回收站记录。

字段 类型 含义
id INTEGER 回收站记录主键,自增。
user_id INTEGER 删除操作所属用户。
user_photo_id INTEGER 被删除的用户照片 ID。
live_video_id INTEGER 被删除照片关联的动态照片视频 ID。
photo_id INTEGER 被删除照片的底层资源 ID。
recover_info TEXT 恢复照片所需的序列化信息。
delete_at INTEGER 进入回收站的时间。

file_task

文件导入、扫描、移动或整理任务表。

字段 类型 含义
id INTEGER 文件任务主键,自增。
user_id INTEGER 任务所属用户。
file_count INTEGER 任务涉及的文件总数。
done_count INTEGER 已处理完成的文件数。
err_msg TEXT 任务级错误信息。
action TEXT 任务动作类型,例如导入或扫描;具体值未声明。
target_dir TEXT 任务目标目录。
time_used INTEGER 任务耗时,单位未声明。
status INTEGER 任务状态码,具体枚举未声明。
created_at INTEGER 任务创建时间。
updated_at INTEGER 任务最后更新时间。

err_item_log

文件任务中的单项错误日志。

字段 类型 含义
id INTEGER 错误记录主键,自增。
task_id INTEGER 所属文件任务 ID,通常关联 file_task.id
file_path TEXT 发生错误的文件路径。
err_code INTEGER 错误代码。
err_msg TEXT 错误详情。
created_at INTEGER 错误记录创建时间。

google_takeout_log

Google Takeout 导入任务记录。

字段 类型 含义
id INTEGER 导入记录主键,自增。
user_id INTEGER 导入任务所属用户。
task_id TEXT Google Takeout 导入任务唯一标识。
staging_path TEXT 导入过程使用的暂存目录。
final_path TEXT 导入完成后的最终目录。
last_heartbeat INTEGER 任务最近一次心跳时间。
status TEXT 导入任务状态。
created_at INTEGER 任务创建时间。
updated_at INTEGER 任务最后更新时间。

相册外链分享表。

字段 类型 含义
id INTEGER 分享记录主键,自增。
name TEXT 分享链接名称。
share_id TEXT 对外使用的分享 ID,存在唯一索引。
owner INTEGER 分享拥有者的用户 ID。
album_id INTEGER 分享所关联的相册 ID,可以为空。
valid_to INTEGER 过期时间戳;0 表示永久有效。
create_time INTEGER 分享创建时间,默认使用 Unix 秒级时间戳。

user_config

用户级键值配置表。

字段 类型 含义
id INTEGER 配置记录主键,自增。
user_id INTEGER 配置所属用户。
k TEXT 配置键。
v TEXT 配置值。
created_at INTEGER 配置创建时间。
updated_at INTEGER 配置最后更新时间。

同一用户下的配置键 k 必须唯一。


sys_config

系统级键值配置表。

字段 类型 含义
id INTEGER 配置记录主键,自增。
key TEXT 系统配置键,必须唯一。
value TEXT 系统配置值。

data_version

业务数据版本记录。

字段 类型 含义
id INTEGER 版本记录主键。
version_code INTEGER 业务数据版本号。
created_at INTEGER 版本记录创建时间。

db_version

数据库结构版本记录。

字段 类型 含义
id INTEGER 版本记录主键。
version_code INTEGER 数据库结构版本号。
created_at INTEGER 版本记录创建时间。

data_licenses

内置数据或第三方数据的许可证信息。

字段 类型 含义
id INTEGER 许可证记录主键,自增。
name TEXT 许可证或数据源名称,必须唯一。
url TEXT 许可证说明或项目网址。

4. SpatiaLite 空间扩展表

以下表大多由 SpatiaLite 自动建立和维护,用于 GPS 坐标、空间参考系、地理范围查询和空间索引。除非非常了解 SpatiaLite 内部机制,否则不建议直接修改。

geometry_columns

空间字段注册表。

字段 类型 含义
f_table_name TEXT 包含空间字段的数据表名称。
f_geometry_column TEXT 几何字段名称。
geometry_type INTEGER 几何类型编码,例如点、线或面。
coord_dimension INTEGER 坐标维度,触发器限制为 234
srid INTEGER 空间参考系 ID。
spatial_index_enabled INTEGER 空间索引状态,约束值为 012

本数据库中,该表用于注册 photo.geom 空间字段。


geometry_columns_auth

空间字段访问控制元数据。

字段 类型 含义
f_table_name TEXT 空间字段所属表名。
f_geometry_column TEXT 空间几何字段名。
read_only INTEGER 是否只读,取值为 01
hidden INTEGER 是否隐藏,取值为 01

geometry_columns_field_infos

空间表普通字段的统计信息。

字段 类型 含义
f_table_name TEXT 空间表名称。
f_geometry_column TEXT 几何字段名称。
ordinal INTEGER 被统计字段的顺序编号。
column_name TEXT 被统计字段的名称。
null_values INTEGER NULL 值数量。
integer_values INTEGER 整数值数量。
double_values INTEGER 浮点值数量。
text_values INTEGER 文本值数量。
blob_values INTEGER BLOB 值数量。
max_size INTEGER 字段值的最大长度或大小。
integer_min INTEGER 整数最小值。
integer_max INTEGER 整数最大值。
double_min DOUBLE 浮点最小值。
double_max DOUBLE 浮点最大值。

geometry_columns_statistics

空间表范围和行数统计。

字段 类型 含义
f_table_name TEXT 空间表名称。
f_geometry_column TEXT 几何字段名称。
last_verified TIMESTAMP 统计信息最后校验时间。
row_count INTEGER 表记录数量。
extent_min_x DOUBLE 空间范围最小 X 坐标。
extent_min_y DOUBLE 空间范围最小 Y 坐标。
extent_max_x DOUBLE 空间范围最大 X 坐标。
extent_max_y DOUBLE 空间范围最大 Y 坐标。

geometry_columns_time

空间表最近数据变更时间。

字段 类型 含义
f_table_name TEXT 空间表名称。
f_geometry_column TEXT 几何字段名称。
last_insert TIMESTAMP 最近一次插入时间。
last_update TIMESTAMP 最近一次更新时间。
last_delete TIMESTAMP 最近一次删除时间。

spatial_ref_sys

空间参考坐标系定义表。

字段 类型 含义
srid INTEGER 空间参考系主键编号。
auth_name TEXT 坐标系权威机构名称,例如 EPSG
auth_srid INTEGER 权威机构定义的坐标系编号。
ref_sys_name TEXT 坐标参考系名称。
proj4text TEXT PROJ.4 格式的坐标系定义。
srtext TEXT WKT 格式的坐标系定义。

spatial_ref_sys_aux

空间参考系辅助属性。

字段 类型 含义
srid INTEGER 对应 spatial_ref_sys.srid
is_geographic INTEGER 是否为地理坐标系。
has_flipped_axes INTEGER 坐标轴顺序是否翻转。
spheroid TEXT 参考椭球体。
prime_meridian TEXT 本初子午线。
datum TEXT 大地基准面。
projection TEXT 投影方法。
unit TEXT 坐标单位。
axis_1_name TEXT 第一坐标轴名称。
axis_1_orientation TEXT 第一坐标轴方向。
axis_2_name TEXT 第二坐标轴名称。
axis_2_orientation TEXT 第二坐标轴方向。

idx_photo_geom

photo.geom 的 R-Tree 空间索引虚拟表。

字段 类型 含义
pkid 虚拟字段 被索引的 photo 数据行 ID。
xmin 虚拟字段 几何范围最小 X 坐标。
xmax 虚拟字段 几何范围最大 X 坐标。
ymin 虚拟字段 几何范围最小 Y 坐标。
ymax 虚拟字段 几何范围最大 Y 坐标。

idx_photo_geom_node

R-Tree 空间索引内部节点表。

字段 类型 含义
nodeno INTEGER R-Tree 内部节点编号。
data 未声明 节点保存的内部二进制数据。

idx_photo_geom_parent

R-Tree 节点父子关系表。

字段 类型 含义
nodeno INTEGER 当前节点编号。
parentnode 未声明 当前节点的父节点编号。

idx_photo_geom_rowid

R-Tree 数据行与节点映射表。

字段 类型 含义
rowid INTEGER 原始数据行号。
nodeno 未声明 该行所在的 R-Tree 节点编号。

views_geometry_columns

空间视图的几何字段映射表。

字段 类型 含义
view_name TEXT 空间视图名称。
view_geometry TEXT 视图中的几何字段名称。
view_rowid TEXT 视图中作为唯一行号的字段。
f_table_name TEXT 视图引用的原始空间表名称。
f_geometry_column TEXT 原始表的几何字段名称。
read_only INTEGER 视图是否只读,取值为 01

views_geometry_columns_auth

空间视图可见性设置。

字段 类型 含义
view_name TEXT 空间视图名称。
view_geometry TEXT 视图中的几何字段名称。
hidden INTEGER 是否隐藏,取值为 01

views_geometry_columns_field_infos

空间视图字段统计信息。

字段 类型 含义
view_name TEXT 空间视图名称。
view_geometry TEXT 视图中的几何字段名称。
ordinal INTEGER 字段顺序编号。
column_name TEXT 字段名称。
null_values INTEGER NULL 值数量。
integer_values INTEGER 整数值数量。
double_values INTEGER 浮点值数量。
text_values INTEGER 文本值数量。
blob_values INTEGER BLOB 值数量。
max_size INTEGER 最大长度或大小。
integer_min INTEGER 整数最小值。
integer_max INTEGER 整数最大值。
double_min DOUBLE 浮点最小值。
double_max DOUBLE 浮点最大值。

views_geometry_columns_statistics

空间视图范围及行数统计。

字段 类型 含义
view_name TEXT 空间视图名称。
view_geometry TEXT 视图中的几何字段名称。
last_verified TIMESTAMP 统计信息最后校验时间。
row_count INTEGER 视图记录数量。
extent_min_x DOUBLE 空间范围最小 X 坐标。
extent_min_y DOUBLE 空间范围最小 Y 坐标。
extent_max_x DOUBLE 空间范围最大 X 坐标。
extent_max_y DOUBLE 空间范围最大 Y 坐标。

virts_geometry_columns

虚拟空间表的几何字段注册信息。

字段 类型 含义
virt_name TEXT 虚拟空间表名称。
virt_geometry TEXT 虚拟表中的几何字段名称。
geometry_type INTEGER 几何类型编码。
coord_dimension INTEGER 坐标维度。
srid INTEGER 空间参考系 ID。

virts_geometry_columns_auth

虚拟空间表的可见性设置。

字段 类型 含义
virt_name TEXT 虚拟空间表名称。
virt_geometry TEXT 虚拟表中的几何字段名称。
hidden INTEGER 是否隐藏,取值为 01

virts_geometry_columns_field_infos

虚拟空间表字段统计信息。

字段 类型 含义
virt_name TEXT 虚拟空间表名称。
virt_geometry TEXT 几何字段名称。
ordinal INTEGER 字段顺序编号。
column_name TEXT 字段名称。
null_values INTEGER NULL 值数量。
integer_values INTEGER 整数值数量。
double_values INTEGER 浮点值数量。
text_values INTEGER 文本值数量。
blob_values INTEGER BLOB 值数量。
max_size INTEGER 字段最大长度或大小。
integer_min INTEGER 整数最小值。
integer_max INTEGER 整数最大值。
double_min DOUBLE 浮点最小值。
double_max DOUBLE 浮点最大值。

virts_geometry_columns_statistics

虚拟空间表范围及行数统计。

字段 类型 含义
virt_name TEXT 虚拟空间表名称。
virt_geometry TEXT 几何字段名称。
last_verified TIMESTAMP 统计信息最后校验时间。
row_count INTEGER 记录数量。
extent_min_x DOUBLE 空间范围最小 X 坐标。
extent_min_y DOUBLE 空间范围最小 Y 坐标。
extent_max_x DOUBLE 空间范围最大 X 坐标。
extent_max_y DOUBLE 空间范围最大 Y 坐标。

ElementaryGeometries

SpatiaLite 的 VirtualElementary 虚拟表。

该虚拟表用于把复合几何对象拆分为基本几何对象。字段由 SpatiaLite 扩展动态提供,SQL 导出文件中没有显式列定义。


KNN

SpatiaLite 的最近邻查询虚拟表。

用于执行 K-Nearest Neighbors 空间查询。字段由扩展动态提供,SQL 中没有显式列定义。


SpatialIndex

SpatiaLite 通用空间索引查询虚拟表。

用于访问已注册空间字段的空间索引。字段由扩展动态提供,SQL 中没有显式列定义。


spatialite_history

SpatiaLite 空间元数据变更历史。

字段 类型 含义
event_id INTEGER 事件主键,自增。
table_name TEXT 发生变更的表名。
geometry_column TEXT 涉及的几何字段名称。
event TEXT 空间元数据操作或事件类型。
timestamp TEXT 事件发生时间。
ver_sqlite TEXT 当时使用的 SQLite 版本。
ver_splite TEXT 当时使用的 SpatiaLite 版本,字段名按原 SQL 保留。

sql_statements_log

SpatiaLite SQL 执行日志。

字段 类型 含义
id INTEGER 日志主键,自增。
time_start TIMESTAMP SQL 开始执行时间。
time_end TIMESTAMP SQL 执行结束时间。
user_agent TEXT 发起 SQL 的客户端或调用方标识。
sql_statement TEXT 被执行的 SQL 语句。
success INTEGER 是否执行成功,取值为 01
error_cause TEXT SQL 执行失败原因。

5. 主要数据库视图

数据库还定义了若干 SpatiaLite 视图,它们不是实际存储业务数据的表。

视图 作用
geom_cols_ref_sys 联合空间字段注册表和空间参考系表。
spatial_ref_sys_all 合并空间参考系主表及辅助属性。
vector_layers 统一列出空间表、空间视图和虚拟空间图层。
vector_layers_auth 统一列出空间图层的只读和隐藏状态。
vector_layers_field_infos 统一列出各类空间图层的字段统计信息。
vector_layers_statistics 统一列出各类空间图层的范围和行数统计。

6. 修改数据库时的注意事项

  1. 修改数据库前,应停止飞牛相册相关服务,并备份原数据库文件。
  2. 不建议直接修改 geometry_columnsspatial_ref_sysidx_photo_geom* 等空间扩展内部表。
  3. photo 是底层文件资源,user_photo 是用户照片实例,删除时必须同时检查两个层级。
  4. 删除 user_photo 前,还应检查以下关联表:
    • album_user_photo
    • user_photo_tag
    • user_photo_category
    • face
    • repeat_photo
    • recycle_bin
  5. 修改 photo.file_path 后,应用层缓存、缩略图路径或文件索引不一定会自动同步。
  6. 修改 GPS 坐标时,除了 latitudelongitude,还可能需要同步更新 geom 及其 R-Tree 空间索引。
  7. 数据库没有完整使用外键约束,手动删除记录不会自动清理所有关联数据。
  8. statussourcecategory 等枚举字段应先观察现有数据取值,再进行修改。
  9. file_hashoriginal_hash 可能参与文件校验或重复照片识别,不应随意修改。
  10. recover_info 很可能保存序列化恢复信息,编辑后可能导致回收站记录无法恢复。

本文档仅描述数据库结构,且由GPT-5.6Thinking生成,并非真实实测数据。字段的实际运行逻辑、枚举值和时间单位,应以对应版本的飞牛相册程序行为为准。