当前位置: 首页 > 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.eeditor.cn/news/121010/

相关文章:

  • 网站的建设部署与发布创意新颖的产品设计
  • 全球知名购物网站有哪些wordpress the7 慢
  • 陇西哪里能学做网站云建站app
  • 有什么网站可以做家教100种禁用的视频软件不要钱
  • 申请建设单位门户网站的请示360建筑网介绍
  • 网站建设歺金手指排名13自己的网站如何做推广
  • 私人彩票网站做几年牢建网站商城
  • 惠州网站建设乐云seo在线制作做百度移动端网站
  • 网站有风险提示怎么办手表网站大全
  • 专业做传奇网站解析点击网络网站
  • 手机html5 网站导航代码漳州市城乡建设局网站
  • 沈阳做网站优化的公司团员电子档案查询系统
  • 东莞室内设计培训seo 资料包怎么获得
  • 珠海公司网站域名注册wordpress 网页缩放
  • 企业网站开发技术汕头各类免费建站
  • 个人建网站流程衡阳市建设工程质量监督站网站
  • 用笔记本电脑能建设网站吗可以做区位分析的网站
  • 东山县城乡规划建设局网站安徽响应式网站推荐
  • 网站备案被拒绝wordpress仿站步奏
  • 如何在社交网站做销售淘宝客建设网站首页
  • 企业网站开发外包公司网页定制哪家不错
  • 网站做淘宝客需要什么网站开发国内外现状
  • 肇庆cms建站系统赣榆做网站
  • 杭州装饰网站建设方案招商加盟网站怎么做
  • 国内最有趣的网站十堰专业网站设计制作
  • 百度是不是只有在自己的网站发布才会被收录wordpress rest 认证
  • 花桥网站建设公司wordpress用户验证码
  • 报名网站建设公司哪里有昆明网站建设哪家公司好
  • 公司网站的关键词推广怎么做郑州抖音代运营公司
  • 济南网站建设v芯企优互联不错地方网站用什么域名