跳到主要内容

概述

数据模型是什么

数据模型是一个用于组织和管理数据的工具,工作在云开发数据库之上。它可以帮助我们更好地理解和操作数据,提高开发效率和数据质量。

云开发数据模型为开发者提供了更加高级的查询、校验等功能,提供了多端 SDK 可供调用,同时可以一键生成可编辑的管理应用。同时内置集成了 CMS 管理端、AI 智能分析能力,方便各种角色的用户进行数据管理和分析。

以下是数据模型的一些核心特点:

  1. 数据校验:自动检查数据是否正确,避免错误。
  2. 关联关系处理:自动处理数据之间的关系,简化操作。
  3. 自动生成代码:根据数据模型快速生成代码,提高开发速度。
  4. CMS 管理端:提供简单易用的数据管理界面,方便非技术人员操作。
  5. 自动生成应用代码:提供快速从模型生成可编辑的管理应用
  6. AI 智能分析:利用 AI 分析数据,发现有价值的信息。
  7. 高级查询支持:支持复杂的查询操作,满足各种需求。

数据模型和数据库的关系

数据模型是对数据库的抽象,它定义了数据模型的结构、字段、约束和关系。数据模型提供了一种统一的方式来描述和操作数据,简化了数据操作和查询。数据模型能力即为开发中常用的对象关系映射 ORM。

数据模型和数据库是关联关系,一个数据模型,对应了数据库中的一个集合(非结构化数据库)或表(结构化数据库)。

使用数据模型,不代表被限制为仅能使用数据模型。在使用数据模型的同时,如果需要有更复杂、或数据模型无法很好完成的操作,也可以通过数据库的原生方法,直接操作数据库完成数据读写。

相对于传统开发框架中的 ORM,云开发数据模型除 ORM 相关的 SDK 操作数据的能力外,额外整合了数据管理界面、用户及权限体系、内容管理以及进一步的基于数据模型的应用生成、数据分析等更多能力。更多优势点可以查看 “为什么要使用数据模型”。

如何启用数据模型

可访问微信云开发云后台-数据模型,选择【新建模型】,可以选择 3 种方式:

  • 从数据集合创建:选择当前环境下的云数据库名称,点击下一步
  • 导入云开发 CMS 模型:选择当前环境下的 CMS 项目和模型,点击下一步
  • 从空白创建:从头创建一个数据模型,数据会存储在当前环境下的云数据库中

新建模型后即可使用数据模型提供的各项能力。

为什么要使用数据模型

使用数据模型可以提高开发效率、降低维护成本、增强数据安全性,并拥有强大的数据分析和管理能力。

数据校验和类型检查

数据模型可以自动处理数据的校验和类型检查,确保数据的准确性和一致性。这有助于在数据输入、更新和查询过程中避免错误,提高数据质量。

首先,我们在云后台的数据模型中定义一个简单的文章数据模型 post

我们定义了两个属性:title(字符串类型)、body(字符串类型)

接下来,我们尝试插入一个包含错误类型数据的对象:

使用 create() 方法创建新文章:

try {
const { data } = await models.post.create({
data: {
title: "你好,世界👋",
body: 123456, // 这里故意设置为字符串类型,而非对象 ID 类型
},
});

// 返回创建的文章 id
console.log(data);
// { id: "7d8ff72c665eb6c30243b6313aa8539e"}
} catch (error) {
console.error("Error:", error);
}

在这个例子中,我们故意将 body 属性的值设置为数字类型 123456,而不是正确的文本类型。当我们尝试插入这条数据时,数据模型会检测到类型不匹配,并抛出一个错误。输出结果如下:

Error: WxCloudSDKError: 【错误】数据格式校验失败。根因:[#/body: expected type: String, found: Integer],原因:字段[正文], 标识[body], 类型不匹配:期望类型:字符串。,解决步骤:请按照原因修改数据类型。 errRecord:{"title":"你好,世界👋","body":123456}【操作】调用 post.create

这个错误提示表明,数据模型成功地检测到了类型错误,并阻止了错误数据的插入。这有助于确保数据的准确性和一致性。

自动处理关联关系

数据模型能够自动处理实体之间的关联关系,如一对一、一对多和多对多等关系。这使得在数据库设计和操作时能够更加方便地管理这些关系,提高数据处理的效率。

我们可以使用嵌套查询数据库中的多个表中读取相关数据 ,例如文章及其评论

例如通过 select 来指定查询结果中返回关联字段及其内部的特定字段。

const { data } = await models.post.list({
// 只查询必要的字段
select: {
_id: true,
title: true,
updatedAt: true,
comments: {
_id: true,
createdAt: true,
comment: true,
},
},
filter: {
where: {},
},
getCount: true, // 开启用来获取总数
});

// 返回查询到的数据列表 `records` 和 总数 `total
// 返回的内容明显是经过了数据库的过滤,只返回了_id, title, updatedAt三个字段
console.log(data);
// {
// records: [
// {
// _id: '9FSAHWM9VV',
// comments: [
// {
// createdAt: 1718096509916,
// comment: '11',
// _id: '9FSAJF3GLG',
// },
// ],
// title: 'Bonjour le Monde👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VU',
// comments: [],
// title: '你好,世界👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VT',
// comments: [],
// title: 'Hola Mundo 👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VS',
// comments: [],
// title: 'Hello World👋',
// updatedAt: 1718096503886,
// },
// ],
// }

自动生成 CRUD 代码

通过数据模型,可以自动生成针对小程序/web/云函数等多端的增删改查(CRUD)代码。这大大减少了开发人员的工作量,提高开发效率。

例如使用 upsert() 方法创建或更新文章内容:

const post = {
title: "Hello World",
body: "Hello World",
_id: "foo",
};
const { data } = await models.post.upsert({
create: post,
update: post,
filter: {
where: {
_id: {
$eq: post._id,
},
},
},
});
console.log(data);
// 新增时返回
// {
// "count": 0,
// "id": "foo"
// }

// 更新时返回
// {
// "count": 1,
// "id": ""
// }

自带 CMS 管理端

数据模型提供了自带的内容管理系统(CMS),非技术人员也能轻松地进行数据管理和维护,降低运营成本。

了解详情

一键生成可编辑的管理端代码

数据模型支持一键生成可编辑的管理端,采用低代码技术可视化修改和定制开发,使得开发者无需手动编写管理界面,进一步提高开发效率

一键 AI 智能分析数据

数据模型可以使用 AI 来对数据进行智能分析。有助于从海量数据中提取有价值的信息,为决策提供有力支持。

支持 MySQL 高级查询

数据模型支持 MySQL 等关系型数据库的高级查询功能,如复杂的条件筛选、排序、分组等。用户能够更加灵活地查询和分析数据,满足各种业务需求。

可参考 数据库原生查询文档

例如 查询作者联系电话以"1858"开头的记录

const result = await models.$runSQL(
"SELECT * FROM `lcap-wzcs_iuujo7p` WHERE author_tel LIKE '{{tel}}';",
{
tel: "1858%",
}
);

console.log(result);
// {"data":{"total":1,"executeResultList":[{"owner":"1739272568342245378","is_published":true,"author_web":"https://qq.com","banner":"cloud://lowcode-0gr8x3i8cd1c6771.6c6f-lowcode-0gr8x3i8cd1c6771-1307578329/weda-uploader/ec687de371d4ad064efd0a424a69e969-logo (1).png","auto_no":"1000","body":"<p>hello world</p>","title":"hello","type":"[\"test\",\"test\"]","author_tel":"18588881111","createdAt":1719475245475,"createBy":"1739272568342245378","read_num":997,"updateBy":"1739272568342245378","_openid":"1739272568342245378","extra":"{}","markdown":"# aa\n\n\n\n","author_email":"a@qq.com","json":"{\"a\":\"1\"}","_id":"9JXU7BWFZJ","region":"北京市","updatedAt":1719475245475}],"backendExecute":"28"},"requestId":"0d4c98c3-a3ff-4c55-93cc-d0f5c835f82c"}