文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何迁移到PlanetScale的无服务器数据库?

2024-12-02 18:41

关注

【51CTO.com快译】作为一名开发者,我一直尝试通过试验和构建来学习新技术。我最近对无服务器数据库颇感兴趣,该技术有望加快部署、增强可扩展性及改善开发者体验。我在测试多个产品后,决定将个人网站由使用Firebase和Redis改用PlanetScale,这是建立在MySQL和Vitess上的新的无服务器数据库平台,是为YouTube 提供支持而开发的开源平台。

我选择PlanetScale的原因如下:

Firebase和Redis

我的网站以前使用Google Firebase和Redis用于实时博文阅读量和留言簿。决定选择这些技术主要是想学习一下。Firebase和Redis(借助Upstash)都很易于上手,无需思考即可扩展,在无服务器环境下运行顺畅。但是我想转而使用基于SQL的数据库(MySQL或PostgreSQL),以获得新的学习体验。

重建SQL

我发现自己在SQL有内置功能的地方编写JavaScript。比如说,我使用Firebase获取 JSON对象阅读量,然后将这些值相加以找到总的阅读量。

  1. const snapshot = await db.ref('views').once('value'); 
  2. const views = snapshot.val();  
  3. const allViews = Object.values(views).reduce((total, value) => total + value);  
  4. With SQL, you can use SUM() instead.   
  5. SELECT SUM(countas total  
  6. FROM views; 

排序同样如此。以前我使用JavaScript sort,现在使用ORDER BY。虽然Firebase确实有类似功能,但我并不使用它。

  1. SELECT * FROM guestbook 
  2. ORDER BY updated_at DESC

SQL是成熟的技术。它已存在多年,会继续存在多年。我在以前的工作中用过它,但仍觉得可以更深入地理解它。我也喜欢使用PostgreSQL(推荐Supabase),强烈推荐考虑该解决方案。

我还坚信使用自己推荐的工具。如果我没有实际动手编写代码、在生产环境中运行应用程序,就很难有把握地向别人推荐产品。我使用PlanetScale Vercel Integration后,大为惊喜。只需点击几下鼠标,我就可以部署整个全栈应用程序。正如开头提到的,数据库迁移与我的心智模型相一致。

迁移现有数据

可能有更好的方法来迁移,但我将数据迁移到PlanetScale的自创解决方案如下:

下面是我使用的两个脚本,供参考。

  1. import db from 'lib/planetscale' 
  2. import guestbookData from 'data/guestbook'  
  3. export default async function handler(req, res) {   
  4.   const toISOString = (unixTimestampInMs) =>   
  5.     new Date(unixTimestampInMs).toJSON().slice(0, 19).replace('T'' ');   
  6.   let query = `INSERT INTO guestbook (email, updated_at, body, created_by)   
  7.     VALUES `;   
  8.   const escapeStr = (str) =>   
  9.     str  
  10.       .replace(/\\/g, '\\\\' 
  11.       .replace(/\$/g, '\\$' 
  12.       .replace(/'/g, "\\'") 
  13.       .replace(/"/g, '\\"'); 
  14.   guestbookData.forEach((item, key) => {  
  15.     var value = JSON.parse(item['value']);  
  16.     query += `("${  
  17.       value.email ? `${value.email}` : 'not@provided.com'   
  18.     }", "${toISOString(value.updated_at)}", "${escapeStr(value.body)}", "${   
  19.       value.created_by  
  20.     }")`;   
  21.     if (key === guestbookData.length - 1) {   
  22.       query += ';'  
  23.     } else {   
  24.       query += ', '  
  25.     }   
  26.   });   
  27.   const [rows] = await db.query(query);   
  28.   return res.status(201).json(rows[0]);  
  29.  
  30. import db from 'lib/planetscale' 
  31. import viewsData from 'data/views'  
  32. export default async function handler(req, res) {   
  33.   let query = `INSERT INTO views (slug, count  
  34.     VALUES `;  
  35.   const slugs = Object.keys(viewsData['views']);  
  36.   slugs.forEach((slug, key) => {   
  37.     const count = viewsData['views'][slug];   
  38.     query += `("${slug}", ${count})`;   
  39.     if (key === slugs.length - 1) {   
  40.       query += ';'  
  41.     } else {   
  42.       query += ', '  
  43.     }   
  44.   });   
  45.   const [rows] = await db.query(query);   
  46.   return res.status(201).json(rows[0]);   

以下是我的PlanetScale模式,用于跟踪博文阅读量和留言簿留言。

  1. CREATE TABLE `views` (  
  2.   `slug` varchar(128) NOT NULL 
  3.   `countbigint NOT NULL DEFAULT '1' 
  4.   PRIMARY KEY (`slug`)  
  5.  
  6. CREATE TABLE `guestbook` (   
  7.  `id` bigint NOT NULL AUTO_INCREMENT,  
  8.   `email` varchar(256) NOT NULL 
  9.   `body` varchar(500) NOT NULL 
  10.   `created_by` varchar(256) NOT NULL 
  11.   `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),  
  12.   `updated_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),  
  13.   PRIMARY KEY (`id`)  

结果

我一直使用Checkly来监控连接到PlanetScale的生产级API的性能。Checkly让我可以设置警报,那样出现停运或性能降到接受的阈值以下时发出警报。迄今为止,我发现我的Next.js API Routes在us-east的Vercel上部署为无服务器函数时延迟约150ms。

 

PlanetScale性能小结

如下图所示,与我之前的Firebase实现相比,响应时间显著加快(请注意我何时进行切换)。 此外,拥有一项而不是两项服务可以清理代码,需要较少的环境变量即可连接到每项服务。

原文How to Migrate to PlanetScale’s Serverless Database,作者:Lee Robinson

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯