当前位置:   article > 正文

微信小程序笔记--数据库_微信小程序 数据库

微信小程序 数据库

学习微信小程序 -- 数据库

数据库

1. 初始化

2. 数据库操作

2.1 数据类型云开发数据库提供以下几种数据类型:

2.2 增删查改

                 2.2.1 增加/插入 数据(add方法)

                 2.2.2 删除数据(remove方法)

                 2.2.3 查看数据(get,where)

                 2.2.4 更新数据(update / set)

3. 云函数

数据库

1. 初始化

查看官方文档:开发指引 -> 数据库 -> 增删改查 -> 初始化.

第一步: 获取数据库的引用 (要操作一个集合,需先获取它的引用。)
在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用(两种情况)。

  1. 以下调用获取 默认环境 的数据库的引用:
    	const db = wx.cloud.database();
    

  2. 如需获取 其他环境 的数据库引用,可以在调用时传入一个对象参数,在其中通过 env 字段指定要使用的环境。此时方法会返回一个对测试环境数据库的引用。
    示例:假设有一个环境名为 test,用做测试环境,那么可以如下获取测试环境数据库:
    1. const testDB = wx.cloud.database({
    2. env: 'test'
    3. })


    第二步:数据库里创建集合

    打开控制台,选择 “数据库” 标签页,通过 “添加集合” 入口创建一个集合。假设我们要创建一个待办事项小程序,我们创建一个名为 todos 的集合。创建成功后,可以看到 todos 集合管理界面,界面中我们可以添加记录、查找记录、管理索引和管理权限。集合 类似于 数据库

     集合 类似于 数据库
     集合里的记录 相当于 数据库里的表

第三步操作集合

在获取了数据库的引用后,就可以通过数据库引用上的 collection 方法获取一个集合的引用了

  1. 比如获取待办事项清单集合:
    1. const todos = db.collection('todos')
    2. // 'todos' 中的 todos 是集合名

    获取集合的引用并不会发起网络请求去拉取它的数据,我们可以通过此引用在该集合上进行 增删查改 的操作。除此之外,还可以通过集合上的 doc 方法 来获取 集合中的一个指定 ID 的记录的引用。同理,记录的引用可以用于对特定记录进行更新和删除操作。

    2.假设我们有一个待办事项的 ID 为 todo-identifiant-aleatoire,那么我们可以通过 doc 方法获取      它的引用:

const todo = db.collection('todos').doc('todo-identifiant-aleatoire')

2. 数据库操作

2.1 数据类型
云开发数据库提供以下几种数据类型

String:字符串
Number:数字
Object:对象
Array:数组
Bool:布尔值
Date:时间


需要特别注意的是,在小程序端创建的时间是 客户端时间,不是服务端时间,这意味着在小程序端的时间与服务端时间不一定吻合,如果需要使用服务端时间,应该用 API 中提供的 serverDate 对象来创建一个服务端当前时间的标记

Geo:多种地理位置类型,详见官方文档
Null:相当于一个占位符,表示一个字段存在但是值为空。

2.2 增删查改


2.2.1 增加/插入 数据(add方法)
可以通过在集合对象上调用 add 方法往集合中插入一条记录。
新增一个待办事项官方代码示例:
 

  • 回调风格调用
    1. db.collection('todos').add({
    2. // data 字段表示需新增的 JSON 数据
    3. data: {
    4. // _id: 'todo-identifiant-aleatoire', // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了
    5. description: "learn cloud database",
    6. due: new Date("2018-09-01"),
    7. tags: [
    8. "cloud",
    9. "database"
    10. ],
    11. // 为待办事项添加一个地理位置(113°E,23°N)
    12. location: new db.Geo.Point(113, 23),
    13. done: false
    14. },
    15. success: function(res) {
    16. // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
    17. console.log(res)
    18. }
    19. })

  • 在创建成功之后,我们可以在控制台中查看到刚新增的数据。
  • 可以在 add API 文档 中查阅完整的 API 定义。
  • 练习代码(Promise 风格)
    1. addData(){
    2. db.collection('js06').add({
    3. // data 字段表示需新增的 JSON 数据
    4. data: {
    5. name:"gao",
    6. age:"23",
    7. sex:"女"
    8. },
    9. }).then(res => {
    10. console.log(res)
    11. });
    12. },

    2.2.2 删除数据(remove方法)

    查看 删除数据-官方文档

  1. 删除一条记录
    对记录使用 remove 方法可以删除该条记录,代码示例:
    1. // 删除数据
    2. deleteData(){
    3. // doc后面是 指定删除 那条的 id 记得:不是_openid哈
    4. db.collection('js06').doc('ab79f8175ee716a500159a000bc74b18').remove({
    5. success: function(res) {
    6. console.log(res.data)
    7. }
    8. })
    9. },
    10. // 或像下面这样写,比较舒爽一些
    11. deleteData(){
    12. db.collection('js06').doc('ab79f8175ee716a500159a000bc74b18')
    13. .remove()
    14. .then(res => {
    15. console.log(res);
    16. });
    17. },

  2. 删除多条记录
    如果需要更新多个数据,需在 Server 端进行操作(云函数)。可通过 where 语句选取多条记录执行删除,只有有权限删除的记录会被删除。比如删除所有已完成的待办事项:
2.2.3 查看数据(get,where)

 查看 查看数据-官方文档

  1. 获取一个记录的数据

假设已有一个 ID 为 todo-identifiant-aleatoire 的在集合 todos 上的记录,则可以通过在该记录的引用调用 get 方法获取这个待办事项的数据:

  1. db.collection('todos').doc('todo-identifiant-aleatoire').get({
  2. success: function(res) {
  3. // res.data 包含该记录的数据
  4. console.log(res.data)
  5. }
  6. })

也可以用 Promise 风格调用:

  1. db.collection('todos').doc('todo-identifiant-aleatoire').get().then(res => {
  2. // res.data 包含该记录的数据
  3. console.log(res.data)
  4. })

2.获取多个记录

我们也可以一次性获取多条记录。通过调用集合上的 where 方法可以指定查询条件,再调用 get 方法即可只返回满足指定查询条件的记录,比如获取用户的所有未完成的待办事项:

  1. db.collection('todos').where({
  2. _openid: 'user-open-id',
  3. done: false
  4. })
  5. .get({
  6. success: function(res) {
  7. // res.data 是包含以上定义的两条记录的数组
  8. console.log(res.data)
  9. }
  10. })

3.查询指令

假设我们需要查询进度大于 30% 的待办事项,那么传入对象表示全等匹配的方式就无法满足了,这时就需要用到查询指令。数据库 API 提供了大于、小于等多种查询指令,这些指令都暴露在 db.command 对象上。比如查询进度大于 30% 的待办事项:

  1. const _ = db.command
  2. db.collection('todos').where({
  3. // gt 方法用于指定一个 "大于" 条件,此处 _.gt(30) 是一个 "大于 30" 的条件
  4. progress: _.gt(30)
  5. })
  6. .get({
  7. success: function(res) {
  8. console.log(res.data)
  9. }
  10. })

API 提供了以下查询指令:

2.2.4 更新数据(update / set)

查看 更新数据-官方文档
更新数据主要有两个方法:

1.代码练习

  1. // 更新数据
  2. updateData(){
  3. db.collection('js06').doc('ab79f8175ee716a500159a000bc74b18').update({
  4. // data 传入需要局部更新的数据
  5. data: {
  6. // 表示将 done 字段置为 true
  7. // done: true
  8. age:_.gt(15),
  9. name: "高"
  10. }
  11. }).then(res => {
  12. console.log(res);
  13. });
  14. },
  15. // 更新数据 回调风格如下 使用success ,会输出undefined,所以还是用.then舒服点
  16. // updateData(){
  17. // db.collection('js06').doc('ab79f8175ee716a500159a000bc74b18').update({
  18. // // data 传入需要局部更新的数据
  19. // data: {
  20. // name: "高"
  21. // },
  22. // success: function(res) {
  23. // console.log(res.data)
  24. // }
  25. // })
  26. // },

 2.set 与 update 的区别
set 指令的用处在于更新一个字段值为另一个对象。
比如如下语句是更新 style.color 字段为 ‘blue’ 而不是把 style 字段更新为 { color: ‘blue’ } 对象:

  1. const _ = db.command
  2. db.collection('todos').doc('todo-identifiant-aleatoire').update({
  3. data: {
  4. style: {
  5. color: 'blue'
  6. }
  7. },
  8. success: function(res) {
  9. console.log(res.data)
  10. }
  11. })

 如果需要将这个 style 字段更新为另一个对象,可以使用 set 指令:

  1. const _ = db.command
  2. db.collection('todos').doc('todo-identifiant-aleatoire').update({
  3. data: {
  4. style: _.set({
  5. color: 'blue'
  6. })
  7. },
  8. success: function(res) {
  9. console.log(res.data)
  10. }
  11. })

3. 云函数

查看 云函数-官方文档

云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。

小程序内提供了专门用于云函数调用的 API。开发者可以在云函数内使用 wx-server-sdk 提供的 getWXContext 方法获取到每次调用的上下文(appid、openid 等),无需维护复杂的鉴权机制,即可获取天然可信任的用户登录态(openid)。
比如我们如下定义一个云函数,命名为 add ,功能是将传入的两个参数 a 和 b 相加:

  1. // index.js 是入口文件,云函数被调用时会执行该文件导出的 main 方法
  2. // event 包含了调用端(小程序端)调用该函数时传过来的参数,同时还包含了可以通过 getWXContext 方法获取的用户登录态 `openId` 和小程序 `appId` 信息
  3. const cloud = require('wx-server-sdk')
  4. exports.main = (event, context) => {
  5. let { userInfo, a, b} = event
  6. let { OPENID, APPID } = cloud.getWXContext() // 这里获取到的 openId 和 appId 是可信的
  7. let sum = a + b
  8. return {
  9. OPENID,
  10. APPID,
  11. sum
  12. }
  13. }

在开发者工具中上传部署云函数后,我们在小程序中可以这么调用:

除了部署云函数进行调用外,我们还支持云函数本地调试,可以不用部署云函数即可测试

  1. wx.cloud.callFunction({
  2. // 需调用的云函数名
  3. name: 'add',
  4. // 传给云函数的参数
  5. data: {
  6. a: 12,
  7. b: 19,
  8. },
  9. // 成功回调
  10. complete: console.log
  11. })
  12. // 当然 promise 方式也是支持的
  13. wx.cloud.callFunction({
  14. name: 'add',
  15. data: {
  16. a: 12,
  17. b: 19
  18. }
  19. }).then(console.log)

如需在云函数中操作数据库、管理云文件、调用其他云函数等操作,可使用官方提供的 npm 包 wx-server-sdk 进行操作。

代码练习

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init();
  4. // 记得下面这两步
  5. const db = cloud.database()
  6. const _ = db.command
  7. // 记得右键index.js文件更新!!!
  8. // 云函数入口函数
  9. exports.main = async (event, context) => {
  10. try{
  11. return await db.collection('js06').where({ //写条件查找~
  12. age:_.gt(15) //记得在该文件前面 定义一下 db 和 _
  13. })
  14. .update({ //可执行不同操作
  15. data:{ //没有的话新增,有的话是修改
  16. height:"187cm"
  17. },
  18. })
  19. }catch(e){
  20. console.error(e)
  21. }
  22. // const wxContext = cloud.getWXContext()
  23. // return {
  24. // event,
  25. // name:"张三"
  26. // }
  27. }
  1. // 云函数的调用
  2. // 有些像ajax(但不是哈)
  3. updateiCloudData(){
  4. wx.cloud.callFunction({
  5. name: 'updateData', // 写的是package.json里的name名
  6. data: {
  7. a: 10,
  8. b: 20
  9. }
  10. }).then(res => {
  11. console.log(res);
  12. })
  13. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/481851
推荐阅读
相关标签
  

闽ICP备14008679号