如何负责任地使用 Google 表格作为数据库
TL;DR(30 秒)
限制
工作原理
端点
尽管数据库技术和其他工具已经取得了长足的进步,但电子表格的多功能性和直观性仍然难以匹敌。虽然将它们用于存储 COVID-19 患者数据等敏感关键应用并不明智,但每个人都知道如何使用电子表格,这意味着它们非常适合小型跨职能项目,在这些项目中,非开发人员可能需要检查或编辑数据。
在本指南中,我将向您展示如何使用 Google 表格作为数据库,并配备可通过 HTTP 访问的 API 接口。我们将使用Autocode(一个内置自动完成功能的 Node.js API 开发平台和编辑器)来部署一个简单的应用并处理 Google 的身份验证流程。我还将探讨 Google 表格的局限性,包括可扩展性,以及在哪些情况下可以考虑更复杂的替代方案。
# Returns all people in the database whose names start
# with "bil", case-insensitive
$ curl --request GET --url \
'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'
[
{
"Name": "Bilbo Baggins",
"Job": "Burglar",
"Fictional": "TRUE",
"Born On": "9/21/1937",
"Updated At": ""
},
{
"Name": "Bill Nye",
"Job": "Scientist",
"Fictional": "FALSE",
"Born On": "11/27/1955",
"Updated At": ""
},
{
"Name": "billie eilish",
"Job": "Artist",
"Fictional": "FALSE",
"Born On": "12/18/2001",
"Updated At": ""
}
]
只需一个 Google 帐户和一个免费的 Autocode 帐户,即可开始使用。开始吧!
TL;DR(30 秒)
首先,您需要点击此处,然后按右上角的“使用模板”来克隆您自己的 Google Sheet 模板副本。这会将示例电子表格添加到您的个人 Google 帐户。
完成后,点击此处在 Autocode 中打开入门应用。如果您愿意,可以浏览一下源代码,然后按下绿色按钮将应用安装到您的 Autocode 帐户。当系统提示您关联 Google Sheet 时,请按照流程中的说明关联您的 Google 帐户,然后选择您刚刚克隆的电子表格。
之后,您的应用就可以运行了!尝试通过 URL 访问几个端点,看看返回了什么,以及您的新电子表格数据库发生了什么。您可以查看Endpoints
下面的示例调用部分。
限制
总结起来很简单,对吧?那么为什么不把所有东西都建在 Google 表格上呢?
虽然只需 30 秒即可设置完成且人人皆可交互的后端极具吸引力,但也存在一些明显的局限性。如上所述,作为数据库的电子表格本身并不支持多表或多行关系。此外,它也没有强制指定列的类型、事务、内置备份或加密的概念,因此敏感/关键数据(例如 COVID-19 患者数据)最好存储在其他地方。
在可扩展性方面,Google Sheets 的单元格数量(包括空白单元格)有 5,000,000 个的硬性限制。然而,当我尝试通过创建包含这么多值的电子表格来验证这一点时,却在该阈值之前遇到了严重的性能问题:
像粘贴大量单元格这样的批量操作速度会变慢,当单元格数量达到 100 万左右时,速度会开始下降。导航也变得迟缓。
我进行 API 调用的实验也得到了类似的结果。查询速度似乎与单元格数量呈线性关系:
当单元格数量达到 50 万左右时,查询速度会变得异常缓慢,但对于 10 万个单元格的查询,查询时间仍然低于 2 秒。因此,如果您预计数据集将超过几十万个单元格,那么选择更具可扩展性的方案可能是明智之举。
工作原理
当您将克隆的 Google Sheet 链接到您的应用并将其安装到您的帐户时,Autocode 会使用您的应用的令牌自动处理您的应用和您的 Google 帐户之间的身份验证(请参阅const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN})
所有端点顶部的行)。
对于实际查询,每个端点都包含 Node.js 代码,用于从googlesheets.query API调用方法。这些 API 采用一个以A1 格式range
格式化的参数,该参数对应于 API 调用应视为数据库一部分的电子表格部分。
let queryResult = await lib.googlesheets.query['@0.3.0'].select({
range: `A:E`,
bounds: 'FULL_RANGE',
where: [{
'Name__istartswith': query
}]
});
值range
本质上是“将电子表格中A列到EA:E
列的所有行用作我的数据库”的简写。查询会将该范围内每列的第一行解释为该列中值的字段名称。给定您克隆的模板,上述查询将检查A列(名为)中的所有值,以查找与查询值匹配的行。Name
这些 API 调用使用KeyQL 查询语言。如果您有兴趣深入了解,可以查看更多示例。
呼叫端点
如前所述,这些端点可以通过 HTTP 访问,因此您可以通过 、 或任何其他您喜欢的 HTTP 客户端来调用它们fetch
。cURL
您可以直接使用 Web 浏览器:
您甚至可以使用端点用来调用 Google Sheets API 的相同lib-node Node 包:
您的端点将响应 GET 或 POST 请求。对于 GET 请求,参数会从查询字符串中解析;对于 POST 请求,参数会从请求正文中解析。为了清晰起见,每个端点都设置了默认参数。您可以在下方找到每个端点的示例。
端点
函数/选择/作业/contains.js
此端点是 KeyQL 查询的一个示例contains
。它会在链接的 Google Sheet 中查找字段Job
包含与参数 匹配的子字符串(区分大小写)的行query
。从示例工作表中,它返回:
$ curl --request GET --url \
'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/job/contains/?query=ist'
[
{
"Job": "Mistborn",
"Born On": "2006-07-17",
"Fictional": "TRUE",
"Name": "Vin Venture",
"Updated At": ""
},
{
"Job": "Scientist",
"Born On": "1955-11-27",
"Name": "Bill Nye",
"Fictional": "FALSE",
"Updated At": ""
},
{
"Job": "Artist",
"Born On": "2001-12-18",
"Name": "billie eilish",
"Fictional": "FALSE",
"Updated At": ""
}
]
函数/选择/born_on/date_gt.js
此端点是 KeyQL 查询的一个示例date_gt
。它会在链接的 Google Sheet 中查找字段Born On
位于query
参数之后的行,格式为2000/01/01
。从示例工作表中,它返回:
$ curl --request GET --url \
'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/born_on/date_gt/?query=2000/01/01'
[
{
"Job": "Mistborn",
"Born On": "2006/07/17",
"Fictional": "TRUE",
"Name": "Vin Venture",
"Updated At": ""
},
{
"Job": "Artist",
"Born On": "2001/12/18",
"Name": "billie eilish",
"Fictional": "FALSE",
"Updated At": ""
}
]
函数/选择/名称/istartswith.js
此端点是 KeyQL 查询的一个示例istartswith
。它会在链接的 Google Sheet 中查找字段Name
以query
参数(不区分大小写)开头的行。在示例表格中,它返回:
$ curl --request GET --url \
'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'
[
{
"Job": "Scientist",
"Born On": "1955-11-27",
"Name": "Bill Nye",
"Fictional": "FALSE",
"Updated At": ""
},
{
"Job": "Artist",
"Born On": "2001-12-18",
"Name": "billie eilish",
"Fictional": "FALSE",
"Updated At": ""
},
{
"Job": "Burglar",
"Born On": "1937-09-21",
"Fictional": "TRUE",
"Name": "Bilbo Baggins",
"Updated At": ""
}
]
函数/insert.js
此端点是插入查询的一个示例。它将输入参数传递给googlesheets.query.insertfieldsets
API的参数 。例如,要添加到电子表格,您可以发出以下请求(所有参数均为小写):Bill Gates
$ curl --request POST \
--header "Content-Type: application/json" \
--data '{"name":"Bill Gates","job":"CEO","fictional":false,"bornOn":"10/28/1955"}' \
--url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/insert/'
注意: Autocode API 不会专门响应一种 HTTP 方法,而是依赖描述性命名来避免功能混淆。
函数/update.js
此端点是更新查询的一个示例。它设置Updated At
姓名与参数完全匹配的人员字段name
,并根据输入参数更新其他字段。它使用googlesheets.query.update API。
例如,要更新电子表格中的Job
字段,您可以发出以下请求(所有参数均为小写):Bilbo Baggins
Ring Bearer
$ curl --request POST \
--header "Content-Type: application/json" \
--data '{"name":"Bilbo Baggins","job":"Ring Bearer"}' \
--url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/update/'
注意:如果多行符合查询条件,则这可能会影响多行。
函数/delete.js
此端点是删除查询的一个示例。它会删除
姓名与参数完全匹配的人员行name
。它使用googlesheets.query.delete API。例如,要从Bilbo Baggins
电子表格中删除人员,您可以发出以下请求:
$ curl --request GET --url \
'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/delete/?name=Bilbo%20Baggins'
注意:如果多行符合查询条件,则这可能会影响多行。
谢谢你!
如果您有任何问题或反馈,最好的办法是加入 Autocode 社区的 Slack 频道。您可以从网站顶部栏的“社区”标签页获取邀请。您也可以直接在 Twitter 上联系我@Hacubu。
如果您想了解 Autocode 的最新动态,可以关注@AutocodeHQ。祝您黑客愉快!
文章来源:https://dev.to/hacubu/how-to-use-google-sheets-as-a-database-responsible-3ohk