# 概述

# 数据模型是什么

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

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

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

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

# 如何启用数据模型

可访问微信云开发云后台-数据模型,选择【新建模型】,可以选择 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),非技术人员也能轻松地进行数据管理和维护,降低运营成本。

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

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

# 支持 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"}