当前位置: 首页 > news >正文

南京企业建站系统织梦网站环境

南京企业建站系统,织梦网站环境,基于互联网 模式下的安全网站建设,金华大企业网站建设有哪些​Prisma是一种流行的用于服务器端JavaScript和TypeScript的数据映射层#xff08;ORM#xff09;。它的核心目的是简化和自动化数据在存储和应用程序代码之间的传输方式。Prisma支持各种数据存储#xff0c;并为数据持久化提供了一个强大而灵活的抽象层。通过这个基于代码的…​Prisma是一种流行的用于服务器端JavaScript和TypeScript的数据映射层ORM。它的核心目的是简化和自动化数据在存储和应用程序代码之间的传输方式。Prisma支持各种数据存储并为数据持久化提供了一个强大而灵活的抽象层。通过这个基于代码的导览你可以对Prisma及其核心功能有一个初步了解。 JavaScript的ORM层 对象关系映射ORM最早由Java中的Hibernate框架引入。对象关系映射的最初目标是解决Java类和关系型数据库表之间的所谓阻抗不匹配问题。从这个想法发展出了更广泛的雄心勃勃的概念即为应用程序提供一个通用的持久化层。Prisma是Java ORM层的现代JavaScript演进。Prisma支持多种SQL数据库并扩展到包括NoSQL数据存储MongoDB。无论数据存储类型如何总体目标仍然是为应用程序提供一个标准化的处理数据持久化的框架。 领域模型 我们将使用一个简单的领域模型来查看数据模型中的几种关系多对一、一对多和多对多。我们将跳过一对一因为它与多对一非常相似。 Prisma使用一个模型定义模式作为应用程序和数据存储之间的枢纽。在构建应用程序时我们可以采用一种方法即从这个定义开始构建代码。Prisma会自动将模式应用到数据存储中。 Prisma模型定义格式并不难理解你可以使用一个图形工具PrismaBuilder来创建一个。我们的模型将支持一个协作式的创意开发应用程序所以我们将有User用户、Idea创意和Tag标签模型。一个User可以拥有多个Idea一对多关系而一个Idea只能有一个Owner多对一关系。User和Tag之间形成了多对多关系。列表1显示了模型定义。 列表1. Prisma中的模型定义 datasource db {provider sqliteurl file:./dev.db } ​ generator client {provider prisma-client-js } ​ model User {id Int id default(autoincrement())name Stringemail String uniqueideas Idea[] } ​ model Idea {id Int id default(autoincrement())name Stringdescription Stringowner User relation(fields: [ownerId], references: [id])ownerId Inttags Tag[] } ​ model Tag {id Int id default(autoincrement())name String uniqueideas Idea[] }列表1包括一个数据源定义一个简单的SQLite数据库Prisma用于开发目的和一个客户端定义其中“generator client”设置为“prisma-client-js”。后者意味着Prisma将生成一个JavaScript客户端应用程序可以使用该客户端与模型定义创建的映射进行交互。至于模型定义注意每个模型都有一个id字段并且我们使用Prisma的注解来获得自动递增的整数ID.iddefault(autoincrement()) 为了在User和Idea之间创建关系我们使用数组括号引用了Idea类型这表示给我一个Idea的集合属于该User。在关系的另一侧你使用单个Idea来表示owner User relation(fields: [ownerId], references: [id])。User拥有一个owner字段它引用了User的id字段。除了关系和主键ID字段之外字段定义都很简单例如name是一个字符串字段content是一个字符串字段等等。 创造项目 我们将使用一个简单的项目来使用Prisma的功能。第一步是创建一个新的Node.js项目并添加依赖项。然后我们可以添加列表1中的定义并使用它来处理数据持久化使用Prisma内置的SQLite数据库。为了启动我们的应用程序我们将创建一个新的目录初始化一个npm项目并安装依赖项如列表2所示。 列表2创建应用程序 mkdir iw-prisma cd iw-prisma npm init -y npm install express prisma/client body-parser mkdir prisma touch prisma/schema.prisma现在在项目根目录下创建一个名为prisma的文件夹并在其中创建一个名为schema.prisma的文件。将列表1中的模型定义复制到schema.prisma文件中。接下来告诉Prisma使用模型定义来准备SQLite数据库的架构如列表3所示。 列表3设置数据库 npx prisma migrate dev --name init npx prisma migrate deploy列表3中的命令告诉Prisma要对数据库进行“迁移”这意味着将Prisma定义中的模式更改应用到数据库本身。--preview-feature标志告诉Prisma使用开发配置文件而--name标志为更改指定一个任意的名称。--apply标志告诉Prisma应用这些更改。 使用数据 现在让我们在Express.js中创建一个RESTful端点来允许创建用户。可以在列表4中看到我们服务器的代码它将放在server.js文件中。列表4是原始的Express代码但是由于Prisma的存在我们可以以最小的努力对数据库进行大量的操作。 列表4展现代码 const express require(express); const bodyParser require(body-parser); const { PrismaClient } require(prisma/client); ​ const prisma new PrismaClient(); const app express(); app.use(bodyParser.json()); ​ const port 3000; app.listen(port, () {console.log(Server is listening on port ${port}); }); ​ // Fetch all users app.get(/users, async (req, res) {const users await prisma.user.findMany();res.json(users); }); ​ // Create a new user app.post(/users, async (req, res) {const { name, email } req.body;const newUser await prisma.user.create({ data: { name, email } });res.status(201).json(newUser); });目前我们只有两个端点一个用于获取所有用户的列表一个用于添加用户。你可以看到我们如何使用Prisma客户端来处理这些用例分别调用prisma.user.findMany()和prisma.user.create()。prisma.user.findMany()方法没有任何参数将返回数据库中的所有行。prisma.user.create()方法接受一个包含新行值的data字段的对象在这种情况下是name和email字段记住Prisma会自动为我们创建一个唯一的ID。现在我们可以使用以下命令运行服务器.node server.js 使用CURL进行测试 使用CURL命令来测试我们的端点如列表5所示。 列表5使用CURL尝试端点 $ curl http://localhost:3000/users [] $ curl -X POST -H Content-Type: application/json -d {name:George Harrison,email:george.harrisonexample.com} http://localhost:3000/users {id:2,name:John Doe,email:john.doeexample.com}{id:3,name:John Lennon,email:john.lennonexample.com}{id:4,name:George Harrison,email:george.harrisonexample.com} $ curl http://localhost:3000/users [{id:2,name:John Doe,email:john.doeexample.com},{id:3,name:John Lennon,email:john.lennonexample.com},{id:4,name:George Harrison,email:george.harrisonexample.com}]列表5展示了我们获取所有用户并找到一个空集合然后添加用户最后获取填充的集合。接下来让我们添加一个端点让我们能够创建想法并将其与用户关联起来如列表6所示。 列表6用户想法的POST端点 app.post(/users/:userId/ideas, async (req, res) {const { userId } req.params;const { name, description } req.body; ​try {const user await prisma.user.findUnique({ where: { id: parseInt(userId) } }); ​if (!user) {return res.status(404).json({ error: User not found });} ​const idea await prisma.idea.create({data: {name,description,owner: { connect: { id: user.id } },},}); ​res.json(idea);} catch (error) {console.error(Error adding idea:, error);res.status(500).json({ error: An error occurred while adding the idea });} }); ​ app.get(/userideas/:id, async (req, res) {const { id } req.params;const user await prisma.user.findUnique({where: { id: parseInt(id) },include: {ideas: true,},});if (!user) {return res.status(404).json({ message: User not found });}res.json(user); });在列表6中我们有两个端点。第一个端点允许使用POST请求在/users/:userId/ideas路径下添加一个想法。首先它需要通过ID来获取用户使用prisma.user.findUnique()方法。这个方法用于根据传入的条件在数据库中查找单个实体。在我们的例子中我们想要获取具有请求中的ID的用户所以我们使用{ where: { id: parseInt(userId) } }。一旦我们获取到用户我们使用prisma.idea.create()来创建一个新的想法。这个方法的使用方式与创建用户时类似但是现在我们有了一个关联字段。Prisma允许我们使用owner: { connect: { id: user.id } }来创建新的想法与用户之间的关联。第二个端点是一个GET请求在/users/ideas/:id路径下。这个端点的目的是根据用户ID返回包括他们的想法在内的用户信息。这里使用了prisma.user.findUnique()方法的include选项来告诉Prisma包括关联的想法。如果没有这个选项想法将不会被包括在返回结果中因为Prisma默认使用延迟加载的策略来获取关联数据。为了测试这些新的端点我们可以使用列表7中显示的CURL命令。 列表7用于测试端点的CURL $ curl -X POST -H Content-Type: application/json -d {name:New Idea, description:Idea description} http://localhost:3000/users/3/ideas ​ $ curl http://localhost:3000/userideas/3 {id:3,name:John Lennon,email:john.lennonexample.com,ideas:[{id:1,name:New Idea,description:Idea description,ownerId:3},{id:2,name:New Idea,description:Idea description,ownerId:3}]}我们能够添加想法并恢复带有想法的用户。 多对多关系与标签 现在让我们添加处理多对多关系中标签的端点。在列表8中我们处理标签的创建并将其与想法关联起来。 列表8添加和显示标签 // create a tag app.post(/tags, async (req, res) {const { name } req.body; ​try {const tag await prisma.tag.create({data: {name,},}); ​res.json(tag);} catch (error) {console.error(Error adding tag:, error);res.status(500).json({ error: An error occurred while adding the tag });} }); ​ // Associate a tag with an idea app.post(/ideas/:ideaId/tags/:tagId, async (req, res) {const { ideaId, tagId } req.params; ​try {const idea await prisma.idea.findUnique({ where: { id: parseInt(ideaId) } }); ​if (!idea) {return res.status(404).json({ error: Idea not found });} ​const tag await prisma.tag.findUnique({ where: { id: parseInt(tagId) } }); ​if (!tag) {return res.status(404).json({ error: Tag not found });} ​const updatedIdea await prisma.idea.update({where: { id: parseInt(ideaId) },data: {tags: {connect: { id: tag.id },},},}); ​res.json(updatedIdea);} catch (error) {console.error(Error associating tag with idea:, error);res.status(500).json({ error: An error occurred while associating the tag with the idea });} });我们已经添加了两个端点。第一个端点用于添加标签在之前的示例中已经熟悉了。在列表8中我们还添加了一个将想法与标签关联起来的端点。为了关联一个想法和一个标签我们利用了模型定义中的多对多映射关系。我们通过ID获取想法和标签并使用connect字段将它们设置在彼此之间。现在想法的标签集合中包含了标签的ID反之亦然。多对多关联允许最多两个一对多关系每个实体指向另一个实体。在数据存储中这需要创建一个“查找表”或交叉引用表但是Prisma会为我们处理这个过程。我们只需要与实体本身进行交互。我们多对多功能的最后一步是允许通过标签查找想法并通过想法查找标签。你可以在列表9中看到模型的这一部分。为了简洁起见我删除了一些错误处理。 列表9通过想法找到标签通过标签找到想法 // Display ideas with a given tag app.get(/ideas/tag/:tagId, async (req, res) {const { tagId } req.params; ​try {const tag await prisma.tag.findUnique({where: {id: parseInt(tagId)}}); ​const ideas await prisma.idea.findMany({where: {tags: {some: {id: tag.id}}}}); ​res.json(ideas);} catch (error) {console.error(Error retrieving ideas with tag:, error);res.status(500).json({error: An error occurred while retrieving the ideas with the tag});} }); ​ // tags on an idea: app.get(/ideatags/:ideaId, async (req, res) {const { ideaId } req.params;try {const idea await prisma.idea.findUnique({where: {id: parseInt(ideaId)}}); ​const tags await prisma.tag.findMany({where: {ideas: {some: {id: idea.id}}}}); ​res.json(tags);} catch (error) {console.error(Error retrieving tags for idea:, error);res.status(500).json({error: An error occurred while retrieving the tags for the idea});} });在这里我们有两个端点一个用于查找给定标签ID的标签另一个用于查找给定想法ID的标签。它们的工作方式与在一对多关系中非常相似Prisma会处理查找表的关联。例如在查找想法上的标签时我们使用findMany方法并使用条件来查找具有相关ID的想法如列表10所示。 列表10测试标签概念的多对多关系 $ curl -X POST -H Content-Type: application/json -d {name:Funny Stuff} http://localhost:3000/tags ​ $ curl -X POST http://localhost:3000/ideas/1/tags/2 {idea:{id:1,name:New Idea,description:Idea description,ownerId:3},tag:{id:2,name:Funny Stuff}} ​ $ curl localhost:3000/ideas/tag/2 [{id:1,name:New Idea,description:Idea description,ownerId:3}] ​ $ curl localhost:3000/ideatags/1 [{id:1,name:New Tag},{id:2,name:Funny Stuff}]结论 虽然我们在这里介绍了一些CRUD和关系基础知识但Prisma还具有更多的功能。它提供了级联操作如级联删除提供了获取策略可以对从数据库返回的对象进行精细调整支持事务、查询和过滤API等。Prisma还允许根据模型对数据库模式进行迁移。此外它通过在框架中抽象出所有数据库客户端工作使应用程序与数据库无关。Prisma提供了很多便利和强大的功能只需定义和维护模型定义即可。很容易理解为什么这个JavaScript的ORM工具是开发者的热门选择。 作者Matthew Tyson 更多技术干货请关注公众号“云原生数据库” squids.cn目前可体验全网zui低价RDS免费的迁移工具DBMotion、SQL开发工具等。
http://www.dnsts.com.cn/news/145848.html

相关文章:

  • 吉林省建设厅网站周军seo学习
  • 长沙做网站备案2023最建议买10款手机
  • 潍坊建设局职称公布网站网络考试
  • 济南网站建设及推广做网站价格
  • 做阿里云网站的公司湘潭网络公司
  • 教育wordpress模板下载地址搜索引擎优化的英语简称
  • 流量网站应该怎么做做个网站要钱吗
  • 免费建网站推广wordpress阿里云图片不显示
  • 云虚拟主机可以做多少个网站秦都区建设局网站
  • 平面设计网站知乎贷款超市网站开发
  • 天猫商城网站风格石狮网站建设
  • 建设一个网站需要什么技术人员建网站签合同
  • 长沙网站制作多少钱什么是网络营销?它的内涵包括哪几个层次?
  • 怎么优化整站重庆腊肠怎么制作
  • 南京做网站的公司排名公司网页设计费用
  • 芜湖网站建设whwzjs2003网站服务器建设中
  • 外贸球衣网站牛年起广告公司名字
  • 网站建设高等教育出版社有哪些网络平台
  • 网络设计开发网站六安招聘网官网
  • 免网站域名注册新手怎样学校做网站
  • 做美工用什么素材网站网站广告推广怎么做
  • 系统管理网站建网站的宽带多少
  • 合肥建站企业电信备案网站
  • ssh做的网站山西城乡建设厅网站
  • 网站联系qq代码推广一手渠道
  • 网站建设从化做免费网站安全吗
  • 织梦网站404怎么做wordpress 修改数据库连接
  • 分类信息发布 wordpress企业seo推广外包
  • 小题狂做+官方网站vue前端页面模板
  • 信誉好的丹徒网站建设电影资源分享网站怎么做的