- 1. 一、背景
- 2. 二、准备工作
- 3. 三、迁移方法
- 4. 四、故障回滚
- 5. 附录A:AI生成的数据库解释
- 5.1. 1. 阅读说明
- 5.2. 2. 核心数据关系
- 5.3. 3. 核心业务表
- 5.3.1. user
- 5.3.2. device
- 5.3.3. photo
- 5.3.4. user_photo
- 5.3.5. user_folder
- 5.3.6. user_album
- 5.3.7. album_user_photo
- 5.3.8. album_condition
- 5.3.9. user_album_grant
- 5.3.10. user_tag
- 5.3.11. user_photo_tag
- 5.3.12. user_photo_category
- 5.3.13. person
- 5.3.14. face
- 5.3.15. face_task_log
- 5.3.16. folder_cover
- 5.3.17. address_task
- 5.3.18. repeat_photo
- 5.3.19. recycle_bin
- 5.3.20. file_task
- 5.3.21. err_item_log
- 5.3.22. google_takeout_log
- 5.3.23. share_link
- 5.3.24. user_config
- 5.3.25. sys_config
- 5.3.26. data_version
- 5.3.27. db_version
- 5.3.28. data_licenses
- 5.4. 4. SpatiaLite 空间扩展表
- 5.4.1. geometry_columns
- 5.4.2. geometry_columns_auth
- 5.4.3. geometry_columns_field_infos
- 5.4.4. geometry_columns_statistics
- 5.4.5. geometry_columns_time
- 5.4.6. spatial_ref_sys
- 5.4.7. spatial_ref_sys_aux
- 5.4.8. idx_photo_geom
- 5.4.9. idx_photo_geom_node
- 5.4.10. idx_photo_geom_parent
- 5.4.11. idx_photo_geom_rowid
- 5.4.12. views_geometry_columns
- 5.4.13. views_geometry_columns_auth
- 5.4.14. views_geometry_columns_field_infos
- 5.4.15. views_geometry_columns_statistics
- 5.4.16. virts_geometry_columns
- 5.4.17. virts_geometry_columns_auth
- 5.4.18. virts_geometry_columns_field_infos
- 5.4.19. virts_geometry_columns_statistics
- 5.4.20. ElementaryGeometries
- 5.4.21. KNN
- 5.4.22. SpatialIndex
- 5.4.23. spatialite_history
- 5.4.24. sql_statements_log
- 5.5. 5. 主要数据库视图
- 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的权限。

②尝试连接
在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表,跳转到数据,可以在右侧看到一个表格如下图所示。

由于本人从旧的机器的vol2迁移到新的vol2,为了模拟路径变动,因此本人在旧机器的vol1中也创建了一些照片和视频,并迁移后放在了vol2的目录下,还修改了部分路径。
这里在上方搜索框搜到vol1,结果如下,我希望视频放到/vol2/1000/Photos/photo videos/2026下,图片放到/vol2/1000/Photos/other pictures/下,需要修改file_path的目录部分和file_dir

选择新建sql文件,使用下面命令批量修改。每个UPDATE命令修改一套文件夹变动。
1 | UPDATE photo |
这样数据库就修改好了。除此之外,还需要修改相册的存储卷数据,在表user_folder中,可以直接删除这个表中的数据(注意不是删除表),使用下面的sql语句。
1 | DELETE FROM user_folder; |
运行sql语句时,记得观察有无报错,是否正常进行,如果使用图形界面编辑数据库,记得手动点击提交。
3. 删除缓存文件
删除photo.db同目录下的photo.db-shm和photo.db-wal文件。
4. 上传到新Nas的对应目录
可以打包后上传,也可以直接整个文件夹传上去,具体方式可以自己选择。
我这里直接上传到vol2下,使用下面命令移动到对应目录。
1 | mv /vol2/1000/trim.photos /usr/local/apps/@appdata/trim.photos |
5. 安装相册
到应用商店重新安装飞牛相册,进入相册后选择对应备份相册文件夹后即可。记得安装之前安装过的人脸模型和只能识别模型。进入设置,找到偏好设置,维护工具,任务名称选择重建索引,重新生成缩略图,清理垃圾数据,都执行一遍。
四、故障回滚
如果出现错误,使用此命令回滚恢复数据库
1 | rm -rf trim.photos/ |
附录A:AI生成的数据库解释
本附录根据飞牛相册 SQLite 数据库导出的 SQL 结构整理,主要用于数据研究、备份恢复和二次开发参考。
字段含义由 SQL 注释、字段命名、索引及表间关系综合推断,并非飞牛官方数据库文档。对于 SQL 中没有给出枚举或单位的字段,本文会明确标注“具体含义未声明”。
1. 阅读说明
1.1 时间字段
数据库中大量使用 INTEGER 保存时间,例如:
created_atupdated_atmod_timedelete_atlast_heartbeat
它们通常是 Unix 时间戳,但 SQL 结构没有统一说明使用秒、毫秒还是其他精度。实际处理前,建议先抽取几条数据进行验证。
1.2 表之间的关联
SQL 导出文件中执行了:
1 | PRAGMA foreign_keys = off; |
而且多数业务表并没有显式声明外键。因此,本文所写的关联关系主要根据字段名和索引推断。
1.3 布尔与枚举字段
以下类型字段通常使用整数表示状态:
statussourceshareddeletedis_liveis_collectspecial_type
除 SQL 中已有注释的字段外,具体枚举值不能仅凭数据库结构确定。
1.4 空间扩展表
数据库包含大量 SpatiaLite 表和虚拟表,例如:
geometry_columnsspatial_ref_sysidx_photo_geomSpatialIndexKNN
这些对象主要用于照片 GPS 坐标、地图查询和空间索引,一般不建议手动修改。
2. 核心数据关系
1 | erDiagram |
核心结构可以简单理解为:
photo保存磁盘上的实际媒体文件信息。user_photo保存媒体文件在某个用户相册空间中的实例。user_album保存相册。album_user_photo连接相册和用户照片。face保存照片中检测到的人脸。person将多个人脸聚合为同一个人物。user_tag和user_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 | album_id + user_photo_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 |
任务最后更新时间。 |
share_link
相册外链分享表。
| 字段 | 类型 | 含义 |
|---|---|---|
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 |
坐标维度,触发器限制为 2、3 或 4。 |
srid |
INTEGER |
空间参考系 ID。 |
spatial_index_enabled |
INTEGER |
空间索引状态,约束值为 0、1 或 2。 |
本数据库中,该表用于注册 photo.geom 空间字段。
geometry_columns_auth
空间字段访问控制元数据。
| 字段 | 类型 | 含义 |
|---|---|---|
f_table_name |
TEXT |
空间字段所属表名。 |
f_geometry_column |
TEXT |
空间几何字段名。 |
read_only |
INTEGER |
是否只读,取值为 0 或 1。 |
hidden |
INTEGER |
是否隐藏,取值为 0 或 1。 |
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 |
视图是否只读,取值为 0 或 1。 |
views_geometry_columns_auth
空间视图可见性设置。
| 字段 | 类型 | 含义 |
|---|---|---|
view_name |
TEXT |
空间视图名称。 |
view_geometry |
TEXT |
视图中的几何字段名称。 |
hidden |
INTEGER |
是否隐藏,取值为 0 或 1。 |
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 |
是否隐藏,取值为 0 或 1。 |
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 |
是否执行成功,取值为 0 或 1。 |
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. 修改数据库时的注意事项
- 修改数据库前,应停止飞牛相册相关服务,并备份原数据库文件。
- 不建议直接修改
geometry_columns、spatial_ref_sys、idx_photo_geom*等空间扩展内部表。 photo是底层文件资源,user_photo是用户照片实例,删除时必须同时检查两个层级。- 删除
user_photo前,还应检查以下关联表:album_user_photouser_photo_taguser_photo_categoryfacerepeat_photorecycle_bin
- 修改
photo.file_path后,应用层缓存、缩略图路径或文件索引不一定会自动同步。 - 修改 GPS 坐标时,除了
latitude和longitude,还可能需要同步更新geom及其 R-Tree 空间索引。 - 数据库没有完整使用外键约束,手动删除记录不会自动清理所有关联数据。
status、source、category等枚举字段应先观察现有数据取值,再进行修改。file_hash和original_hash可能参与文件校验或重复照片识别,不应随意修改。recover_info很可能保存序列化恢复信息,编辑后可能导致回收站记录无法恢复。
本文档仅描述数据库结构,且由GPT-5.6Thinking生成,并非真实实测数据。字段的实际运行逻辑、枚举值和时间单位,应以对应版本的飞牛相册程序行为为准。