石家庄跑了一趟,一口气带回 70 余套乐高,听起来确实是件快乐的事。不过真正让人头疼的,往往不是搬回家那一路,而是搬回来之后:这 70 套分别是什么套装?摆在哪个箱子?哪些已经拆封?哪些零件还齐全?如果只是为了拍一条 Vlog 把它们铺满整张桌子,那视频结束后的“整理环节”,才是工作量飙升的开始。
我见过不少收藏朋友,兴奋点集中在“买”和“开箱”上,却忽视了“管理”。而收藏一旦超过 50 套,记忆就不再可靠。你可能会重复买同一套,可能为了找某一个小零件翻遍所有盒子,也可能在半年后根本想不起自己有一套适合送人的全新套装。这些问题本质不是收纳习惯问题,而是信息管理问题。与其靠拍脑袋,不如给每套乐高建一个“数据库档案”,用脚本批量录入、查询、统计和导出,让整理过程和 Vlog 一样有迹可循。
本文就以“石家庄收获 70 余套乐高”的整理场景为例,从零搭建一个私人乐高库存管理系统。技术方案不复杂:Python 3 + SQLite 做基础数据管理,CSV 做批量导入,Rebrickable 公开接口做套装信息补全,最后用一个 CLI 工具完成查询和导出。整套代码跑完后,你会拥有一个可离线查询、可重复导入、可导出的个人乐高“仓库系统”。如果你收藏积木、手办、图书,也可以直接套用这套思路。
1. 70 余套乐高回家之后,真正的麻烦才开始
我先把结论放在前面:收藏规模越大,管理成本增长得越快。这里的“成本”不单指钱,还包括三类容易被忽略的开销。
第一类是“选择成本”。70 多套摆在眼前时,你很容易陷入选择困难:今晚拼哪套?哪套适合用 Vlog 记录完整拼装过程?如果不知道每套的主题、颗粒数和场景定位,选一套可能要花掉半小时,而不是两分钟。
第二类是“查找成本”。套装外盒都差不多大小,堆起来之后很难分清里面是谁。更麻烦的是,你只有拼到一半发现缺件,才想起要去对应盒子里找备用件。没有位置记录,你会在客厅柜子、书房抽屉和储物间箱子之间来回拉锯。
第三类是“重复成本”。看到某个历史套装价格合适,你觉得“自己没有”,于是又买了一套。回家一查拼搭记录才发现,三年前已经入过同款。这种情况在收藏圈并不少见。避免它的唯一可靠方法,就是在入手前先查库存表,而不是先查购物车。
也就是说,70 套左右的库存,已经处于“靠脑子和 Excel 都容易失控”的临界区。Excel 当然能记,但手工维护的问题很快会出现:编号格式不统一、字段越加越乱、想按状态统计要写一堆筛选,数据很容易变成一滩死水。相比之下,SQLite 单文件数据库更轻量,配合脚本可以做到批量操作、条件查询和自动补全,更适合拿来管理私人收藏。
当然,这套方案也有明确边界:它管理的是“套装级别”的信息,不是每一个零件的精确位置。如果将来要处理零件级 MOC 拼搭,还需要更细的 BOM 管理,那是另一个话题。本文先解决最实用的 70 套库存管理问题。
2. 管理收藏不等于记账:先想清楚要记什么
设计数据库之前,首先要克制住“什么字段都想要”的冲动。字段过多会让录入变成负担,录入一旦变得麻烦,系统很快就会被丢弃。我建议第一版只保留真正影响使用体验的字段。
2.1 套装编号:每套乐高的“主键”
套装编号是最关键的字段。对乐高来说,官方套装通常有一个类似“42115-1”的编号,其中连字符后面的“-1”代表第几版设计。这个编号就像数据库里的主键,作用是唯一标识一套乐高。
这里容易犯一个错误:以为套装编号只是纯数字。实际上,如果不记录“-1”这个后缀,某些产品可能出现多个版本。更稳妥的做法是完整记录官方套装编号,并在数据库层设置唯一约束,从根源上避免重复导入。
2.2 状态、位置、来源:记录里有价值的字段
除了名称和编号,真正有价值的是状态和位置。
状态我建议使用一套固定枚举,例如:待拆封、拼搭中、拼好展示、拆件备用、已转出。用固定枚举而不是自由输入,才能后续做统计。如果允许“放到一半”“拼好了”“散了”这类即兴输入,统计时就会因为文本不统一而失控。
位置字段也很实用。它不是让你精确到每个抽屉,而是记录“客厅展示柜”“书房顶柜”“卧室床边柜”这一层即可。日常找套装,能定位到柜子就已经省下大量时间。
来源字段则记录了购买渠道和地点。对于“石家庄购入”“实体店”“朋友转让”这类信息,很多人初看觉得没必要,等到想复盘一年花了多少钱、从哪些渠道买入时,就会庆幸当初记录了来源。
2.3 数据字典:第一版字段设计
第一版表结构可以参考下表:
| 字段 | 含义 | 示例 | 是否必填 |
|---|---|---|---|
| set_code | 官方套装编号 | DEMO-001 | 是 |
| set_name | 套装名称 | 演示套装 | 是 |
| theme | 所属系列/主题 | 科技系列 | 否 |
| release_year | 发售年份 | 2023 | 否 |
| pieces | 颗粒数 | 1200 | 否 |
| status | 当前状态 | 待拆封 | 是 |
| place | 存放位置 | 客卧顶层柜 | 否 |
| source | 购买来源 | 石家庄实体店 | 否 |
| note | 备注 | 盒况轻微压角 | 否 |
| created_at | 入库时间 | 自动生成 | - |
| updated_at | 更新时间 | 自动生成 | - |
这个数据字典不算复杂,却足够支撑大部分日常操作:按状态统计、按位置查询、按来源复盘、按名称模糊搜索。记住,第一版系统最重要的目标不是功能丰富,而是让用户愿意持续录入和维护。
3. 环境准备:一个干净、可复现的 Python 项目
为了让整理过程可复现,我建议使用独立虚拟环境,而不是直接往系统 Python 里塞依赖。下面操作在 Windows、macOS、Linux 上思路一致,命令差异我会标注。
3.1 需要准备什么
本机需要安装 Python 3。当前主流 Python 3.8 以上版本都可以运行本文示例。检查方式:
python --version如果提示找不到命令,Windows 用户可以尝试:
py --version版本请以你本机实际安装为准,本文不依赖特殊新语法,Python 3 即可。
3.2 项目目录规划
在合适位置创建目录后,建议按下面的结构组织文件:
lego-warehouse/ ├── schema.sql # 建表 SQL ├── init_db.py # 初始化数据库 ├── import_sets.py # 批量导入 CSV ├── query_sets.py # 查询、统计、导出 ├── find_sets_api.py # 调用 Rebrickable 接口 ├── sample_sets.csv # 示例数据 └── lego_warehouse.db # SQLite 数据库文件,会自动生成把代码、数据、数据库放在一个目录内,方便以后整体备份或上传到自己的私有仓库。
3.3 安装依赖
本文只需要三个第三方库:requests、tabulate,以及生成 Excel 时可选用的 pandas 和 openpyxl。为了减少变量,先把基础依赖装上:
cd lego-warehouse python -m venv venvWindows 环境激活虚拟环境:
venv\Scripts\activatemacOS / Linux 环境:
source venv/bin/activate激活后安装依赖:
pip install requests tabulate如果后续需要生成 xlsx 文件,再补充安装:
pip install pandas openpyxl这里统一用 requests 发 HTTP 请求。Python 标准库虽然有 urllib,但 requests 在处理 JSON 和错误码时更直观,适合新手快速落地。
4. 初始化数据库:先建好 70 套库存的“容器”
数据表是一套系统的容器。建表时把唯一约束、默认值和索引设计好,后面导入和查询都会轻松很多。
4.1 建表 SQL
创建schema.sql:
-- file: schema.sql PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS lego_sets ( id INTEGER PRIMARY KEY AUTOINCREMENT, set_code TEXT NOT NULL UNIQUE, set_name TEXT NOT NULL, theme TEXT NOT NULL DEFAULT '未分类', release_year INTEGER, pieces INTEGER, status TEXT NOT NULL DEFAULT '待拆封', place TEXT, source TEXT, note TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')), updated_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')) ); CREATE INDEX IF NOT EXISTS idx_lego_sets_status ON lego_sets(status); CREATE INDEX IF NOT EXISTS idx_lego_sets_theme ON lego_sets(theme);这里的关键设计有三个:
set_code TEXT NOT NULL UNIQUE:确保同一套装不会插入两遍,这是防止重复购买的第一道防线。status TEXT NOT NULL DEFAULT '待拆封':批量导入时即使忘了填状态,也会先落到最合理的默认值。created_at和updated_at:自动记录入库与更新时间,方便日后复盘。
索引不是越多越好。第一版只需要给status和theme加索引,因为这两个字段未来会高频出现在统计条件里。
4.2 用 Python 执行建库脚本
你可以直接在命令行用 sqlite3 执行 schema,但为了统一,我更推荐用 Python 脚本完成初始化。创建init_db.py:
# file: init_db.py import sqlite3 import pathlib BASE_DIR = pathlib.Path(__file__).resolve().parent DB_PATH = BASE_DIR / "lego_warehouse.db" SCHEMA_PATH = BASE_DIR / "schema.sql" def init_db(): conn = sqlite3.connect(DB_PATH) try: sql = SCHEMA_PATH.read_text(encoding="utf-8") conn.executescript(sql) print(f"数据库初始化成功:{DB_PATH}") finally: conn.close() if __name__ == "__main__": init_db()执行:
python init_db.py看到“数据库初始化成功”后,目录下会出现lego_warehouse.db。这个单文件就是后续所有数据的存放位置。
5. 批量录入:把“石家庄收获”变成可查询的记录
70 余套乐高如果一套一套手工录入,不仅效率低,还容易出错。更合理的方式是先列一张 CSV 清单,再写一个可重复运行的导入脚本。CSV 的好处是普通表格软件可以直接编辑,团队成员或家人也能帮忙填写。
5.1 先准备一份 CSV 清单
创建sample_sets.csv,这里只放 3 条演示数据。实际使用时请把“流水账”替换成你真正的套装记录:
set_code,set_name,theme,release_year,pieces,status,place,source,note DEMO-001,演示套装A,示例主题,2023,500,待拆封,客厅展示柜,石家庄,本地示例数据 DEMO-002,演示套装B,示例主题,2022,800,拼搭中,书房桌面,石家庄,本地示例数据 DEMO-003,演示套装C,示例主题,2021,300,拼好展示,卧室置物架,石家庄,本地示例数据建议在 Excel 中填写纯文本编号时,将列格式设置为“文本”。套装编号如果被 Excel 当成数字处理,后续可能出现 0 丢失或科学计数法显示的问题。用带连字符的编号也能减少这种误判,但不可完全依赖。
5.2 幂等导入脚本
“幂等”听起来高级,通俗解释就是:同一个脚本跑第二次,不会因为数据已经存在而报错,也不会产生重复记录。这一能力在批量盘点场景中非常有用。
创建import_sets.py:
# file: import_sets.py import csv import sqlite3 import pathlib import sys BASE_DIR = pathlib.Path(__file__).resolve().parent DB_PATH = BASE_DIR / "lego_warehouse.db" def parse_int(value): try: return int(value) except (TypeError, ValueError): return None def import_csv(csv_path: str): conn = sqlite3.connect(DB_PATH) total = 0 try: with open(csv_path, encoding="utf-8-sig") as f: reader = csv.DictReader(f) for row in reader: code = (row.get("set_code") or "").strip() name = (row.get("set_name") or "").strip() if not code or not name: print("跳过空记录:缺少编号或名称") continue conn.execute( """ INSERT INTO lego_sets ( set_code, set_name, theme, release_year, pieces, status, place, source, note ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(set_code) DO UPDATE SET set_name = excluded.set_name, theme = excluded.theme, release_year = excluded.release_year, pieces = excluded.pieces, status = excluded.status, place = excluded.place, source = excluded.source, note = excluded.note, updated_at = datetime('now', 'localtime') """, ( code, name, row.get("theme") or "未分类", parse_int(row.get("release_year")), parse_int(row.get("pieces")), row.get("status") or "待拆封", row.get("place") or "", row.get("source") or "", row.get("note") or "", ), ) total += 1 conn.commit() print(f"导入完成,共处理 {total} 条记录") finally: conn.close() if __name__ == "__main__": if len(sys.argv) != 2: print("用法: python import_sets.py xxx.csv") sys.exit(1) import_csv(sys.argv[1])写入时使用utf-8-sig编码读取 CSV,是为了兼容 Excel 生成的带 BOM 文件,避免表头首列出现“\ufeff”乱码。
执行导入:
python import_sets.py sample_sets.csv如果再次执行,已经存在的DEMO-001不会被重复插入,而是更新为 CSV 中的最新内容。这正是盘点现场修改后重新导入时最需要的特性。
5.3 导入后检查
导入完成后,可以先简单查看总记录数:
python -c "import sqlite3; conn = sqlite3.connect('lego_warehouse.db'); print(conn.execute('select count(*) from lego_sets').fetchone()[0])"如果你把真实 70 余套装整理成 CSV 并导入,最终这里的数字应该与手头库存数量一致。如果不一致,优先检查 CSV 中是不是有重复编号或空行。
6. 用 Rebrickable 接口自动补全套装信息
手工整理完 70 余套之后,你会发现一个问题:很多盒子上虽然有官方编号,但要补全套装名称、发售年份、系列和颗粒数,仍然需要大量手工录入。此时可以借助公开乐高数据接口来减少重复劳动。
6.1 为什么需要自动补全
如果只是本地记录“编号 + 状态 + 位置”,其实不调用接口也能完成。但当你需要知道某一套属于哪个系列、颗粒数是多少、适合在 Vlog 中做怎样定位时,手工补全的成本就很高。公开数据集的意义,是把“官方套装目录”变成可以程序化查询的信息源。
这里以 Rebrickable 为例说明思路。它是一个社区维护的乐高数据库,提供套装编号、名称、年份、主题、零件数等字段。需要说明的是,第三方公开接口的使用限制和字段定义可能随官方调整,本文只演示关键逻辑,接入前请以官网文档为准。
6.2 注册 key 与请求设置
使用该接口前需要注册账号并申请 API Key,然后在本地环境变量中设置:
export REBRICKABLE_API_KEY="你的key"Windows PowerShell 中对应:
$env:REBRICKABLE_API_KEY="你的key"不要把 API Key 写死在代码中。它相当于你的访问凭证,一旦提交到公开仓库,别人就可以冒用你的身份调用接口。用环境变量保存更安全。
6.3 查询脚本与更新逻辑
创建find_sets_api.py:
# file: find_sets_api.py import os import sys import requests BASE_URL = "https://rebrickable.com/api/v3/lego/sets/" def make_header(): api_key = os.getenv("REBRICKABLE_API_KEY", "") if not api_key: raise RuntimeError("请先设置环境变量 REBRICKABLE_API_KEY") return {"Authorization": f"key {api_key}"} def search_sets(keyword: str): resp = requests.get( BASE_URL, params={"search": keyword, "page_size": 5}, headers=make_header(), timeout=15, ) if resp.status_code != 200: print("请求失败:", resp.status_code, resp.text[:200]) return data = resp.json() for item in data.get("results", []): print(f"{item.get('set_num')} | {item.get('name')} | {item.get('year')} | {item.get('num_parts')} 件") def get_set_by_code(set_code: str): resp = requests.get( f"{BASE_URL}{set_code}/", headers=make_header(), timeout=15, ) if resp.status_code == 404: print("未找到该套装编号,请检查是否包含 -1 后缀") return if resp.status_code != 200: print("请求失败:", resp.status_code, resp.text[:200]) return data = resp.json() print({ "set_code": data.get("set_num"), "set_name": data.get("name"), "year": data.get("year"), "num_parts": data.get("num_parts"), }) if __name__ == "__main__": if len(sys.argv) < 3: print("用法:") print(" python find_sets_api.py search 保时捷") print(" python find_sets_api.py code 42115-1") sys.exit(1) command = sys.argv[1] value = sys.argv[2] if command == "search": search_sets(value) elif command == "code": get_set_by_code(value) else: print("未知命令")搜索示例:
python find_sets_api.py search 保时捷完整编号查询示例:
python find_sets_api.py code 42115-1特别提醒:套装编号一定要写完整。官方数据中的编号通常带版本后缀,比如42115-1。如果只写42115,接口会返回 404,因为对端把编号当成精确主键处理。若你只有外盒上的纯数字编号,建议先走search命令搜索,确认后再使用。
7. 查询、统计与导出:Vlog 清单的真正价值
数据录入完成之后,系统才开始真正产生价值。当你想拍“70 余套乐高合集”Vlog 时,与其一个个搬箱子查,不如直接查询数据库得到一份清单,再按清单去对应位置取货。
7.1 按状态统计库存
建设一个简单的 CLI 查询工具。创建query_sets.py:
# file: query_sets.py import sqlite3 import pathlib import argparse import csv BASE_DIR = pathlib.Path(__file__).resolve().parent DB_PATH = BASE_DIR / "lego_warehouse.db" def connect(): return sqlite3.connect(DB_PATH) def count_by_status(): conn = connect() rows = conn.execute( """ SELECT status, COUNT(*) AS cnt FROM lego_sets GROUP BY status ORDER BY cnt DESC """ ).fetchall() conn.close() print(f"{'状态':<12}{'数量':>6}") for status, cnt in rows: print(f"{status:<12}{cnt:>6}") def list_sets(status: str, keyword: str): conn = connect() sql = """ SELECT set_code, set_name, status, place FROM lego_sets WHERE (? = '' OR status = ?) AND (? = '' OR set_name LIKE ?) ORDER BY set_code """ like = f"%{keyword}%" rows = conn.execute(sql, (status, status, keyword, like)).fetchall() conn.close() print(f"{'编号':<16}{'名称':<30}{'状态':<12}{'位置':<20}") for code, name, st, place in rows: print(f"{code:<16}{name:<30}{st:<12}{place:<20}") def export_csv(output_path: str): conn = connect() rows = conn.execute("SELECT * FROM lego_sets ORDER BY set_code").fetchall() cols = [desc[0] for desc in conn.execute("SELECT * FROM lego_sets").description] conn.close() with open(output_path, "w", encoding="utf-8-sig", newline="") as f: writer = csv.writer(f) writer.writerow(cols) writer.writerows(rows) print(f"已导出到 {output_path},共 {len(rows)} 条记录") def main(): parser = argparse.ArgumentParser(description="乐高收藏管理工具") parser.add_argument("command", choices=["status", "list", "export"]) parser.add_argument("--status", default="") parser.add_argument("--keyword", default="") parser.add_argument("--output", default="lego_backup.csv") args = parser.parse_args() if args.command == "status": count_by_status() elif args.command == "list": list_sets(args.status, args.keyword) elif args.command == "export": export_csv(args.output) if __name__ == "__main__": main()查看整体状态分布:
python query_sets.py status预期输出类似:
状态 数量 待拆封 1 拼搭中 1 拼好展示 1筛选“拼搭中”的套装:
python query_sets.py list --status 拼搭中按名称搜索:
python query_sets.py list --keyword 演示7.2 按摆放位置查询
当 Vlog 拍摄需要某一类主题时,可以先用 location 层面的筛选缩小范围。虽然上面的list命令还没有把位置作为筛选条件,但你可以在 SQLite 中直接扩展。更快的做法是利用表格导出,然后在表格软件里二次筛选。
如果你有 70 多套库存,“位置”字段最大的价值不是日常搜索,而是在大型整理后快速发现“哪些套装还没有填写位置”。对空位置字段做一次集中排查,通常比一套套回忆节省大量时间。
7.3 导出为 CSV 或 Excel
导出 CSV:
python query_sets.py export --output lego_records.csv导出的文件用 Excel 或 WPS 打开后,可以直接发给家人协助确认,也可以作为 Vlog 文案的底稿。因为代码中使用了utf-8-sig,导出文件带 BOM,多数表格软件能正常识别中文。
如果安装了 pandas,还可以临时生成 Excel:
import pandas as pd import sqlite3 conn = sqlite3.connect("lego_warehouse.db") df = pd.read_sql_query("SELECT * FROM lego_sets ORDER BY set_code", conn) df.to_excel("lego_records.xlsx", index=False) conn.close() print("Excel 文件已生成")我的建议是优先使用 CSV 作为数据交换格式,它足够通用;Excel 更适合做一次性交付或发给不熟悉数据的收藏朋友。
8. 常见问题与排查思路
收藏整理过程中,最容易出问题的点往往不在乐高,而在编码、重复和接口调用。下面按实际使用频率列出排查清单:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 导入 CSV 后中文乱码 | CSV 文件编码与脚本读取方式不一致 | 用文本编辑器查看文件编码 | 读取时使用 utf-8-sig;Excel 另存为 CSV UTF-8 |
| 套装编号被识别为数字,0 丢失 | Excel 自动转换纯数字 | 查看 CSV 原始内容 | 列格式设为文本,或编号保留连字符后缀 |
| 重复导入同一套 | 缺少唯一约束或编号不一致 | 查询表中 set_code 是否包含前后空格 | 在 database 层加 UNIQUE,导入前 strip |
| 查询结果为空 | CSV 表头与脚本字段名不一致 | 打印第一行 DictReader 的字段 | 统一表头,必须包含 set_code、set_name |
| Rebrickable 返回 401 | API Key 没设置或写错 | 检查环境变量是否为空 | 重新设置 REBRICKABLE_API_KEY |
| Rebrickable 返回 404 | 套装编号缺少版本后缀 | 确认编号是否为完整格式 | 先 search 再 code,不要凭记忆拼编号 |
| Python 提示找不到模块 | 未激活虚拟环境 | 检查命令行前缀是否有 venv | 执行 source venv/bin/activate 或 venv\Scripts\activate |
| 误删了一条记录 | 手工删除时条件写错 | 检查 sqlite3 命令行日志 | 养成先 SELECT 再 DELETE 的习惯,提前备份 |
这里想强调一个安全习惯:删除数据是高风险操作。SQLite 数据库虽然很小,但也不要直接在生产心态不端正的状态下执行 DELETE。正确流程是先备份,再查询确认删除范围,最后执行删除。如果给朋友或家人维护,不妨在删除前把目标行导出为 CSV。
9. 最佳实践:给收藏数据建立的几条纪律
工具能解决效率,但真正的长期价值来自“纪律”。不立规矩,再好的数据库三个月后也会变成废库。
9.1 统一枚举和命名
状态字段要固定使用同一套词。我自己会限制为“待拆封、拼搭中、拼好展示、拆件备用、已转出”五种。不要因为一时顺手写“拼了一半”“展示中”“出掉了”这类自由文本。统一命名的好处在统计时体现得最明显,分组查询结果一眼能看懂。
9.2 定期备份
SQLite 是单文件,备份非常简单。可以手动复制,也可以用 Python 的 backup API 生成一致性快照:
# file: backup_db.py import sqlite3 import pathlib import datetime BASE_DIR = pathlib.Path(__file__).resolve().parent DB_PATH = BASE_DIR / "lego_warehouse.db" BACKUP_DIR = BASE_DIR / "backups" BACKUP_DIR.mkdir(exist_ok=True) today = datetime.date.today().isoformat() backup_path = BACKUP_DIR / f"lego_backup_{today}.db" src = sqlite3.connect(DB_PATH) dst = sqlite3.connect(backup_path) with dst: src.backup(dst) dst.close() src.close() print(f"备份完成:{backup_path}")相比直接复制文件,使用 backup API 可以避免在写入过程中产生损坏快照,是更稳妥的姿势。建议每次导入大批数据、调整大量记录之后,都跑一次备份。
9.3 把“来源”当作重要字段
很多人在设计表时会忽略“来源”,觉得只是顺手记一下。实际操作中,来源字段可以帮助你回答几个很有价值的问题:今年从不同渠道一共买了多少套?哪一个渠道的盒况描述最靠谱?某一次石家庄行程带回的 70 余套,分别花了多少钱?只有当“地点”“渠道”“时间”被结构化记录后,复盘才有依据。
9.4 数字化不要变成负担
这套系统的目标是减少整理焦虑,不是制造新的仪式感。你可以一开始只记录编号、名称、状态和位置,等信息足够多、确实需要时再加字段。字段越多,录入越累,放弃概率越高。对大部分收藏者来说,一个能坚持维护的简单清单,远胜过一个功能完备但逐渐荒废的复杂系统。
记录时也注意隐私边界。家中的具体楼层、房间和柜子可以在自己数据库里写,但如果要公开分享 Vlog 或截图,不建议把详细房间号、门牌号甚至窗外环境一起展示。数据工具应该服务于爱好,而不是为不必要的信息泄露留出口。
最后说一句实在话:拥有一大批乐高不是结束,能长期清晰知道每套在哪、处于什么状态,才是把爱好活得有条理的表现。从今天的一百来个字、一个 SQLite 文件开始,你可以让任何一次“收获满满”都变成真正可控的资产积累,也让自己在下次想拍 Vlog 时,两分钟就能找到最合适的拍摄主角。