如何从WatermelonDB的fetch()查询结果中获取._raw内的真实数据?
优化查询结果获取方式,避免手动提取
_raw 你当前查询返回的是数据库框架生成的模型实例对象,这些实例包含框架内部管理用的元数据(如__changes、isEditing),业务数据被封装在_raw属性中。虽然用map能提取数据,但确实不是最优解,以下是更专业的处理方案:
1. 使用框架原生API直接获取原始数据
这类ORM框架(比如WatermelonDB)通常提供了跳过模型包装、直接返回原始数据的查询方法,比如fetchRaw():
const rows = await db.active.collections .get('messages') .query( Q.where('status', messagesStatus.ERROR) ).fetchRaw()
调用fetchRaw()后,返回的结果就是你需要的纯业务数据数组,无需再手动处理_raw属性,这是最符合框架设计逻辑的方案。
2. 封装模型方法,提升可读性与可维护性
如果你的框架没有提供fetchRaw()这类方法,可以给模型类添加一个获取原始数据的实例方法,替代直接访问_raw:
// 定义Message模型时添加方法 class MessageModel extends Model { // ... 模型的其他配置(如table名、字段定义) // 封装获取原始数据的方法 get rawData() { return this._raw; } } // 查询后使用 const rawRows = rows.map(row => row.rawData);
这种方式比直接取_raw更具可读性,后续如果框架内部属性名变更,只需修改模型方法即可,无需改动所有调用处。
3. 利用框架的序列化能力
多数ORM会给模型实例提供序列化方法(比如toJSON()),默认会返回过滤掉内部元数据的业务数据:
const rawRows = rows.map(row => row.toJSON());
这是框架官方推荐的对外暴露业务数据的方式,比直接访问私有属性_raw更安全、更符合规范。
内容的提问来源于stack exchange,提问作者Prieyudha Akadita S
相关产品推荐
相关产品推荐

