使用Dgraph和GraphQL创建第一个CRUD

2020年12月30日11:09:02 发表评论 61 次浏览

本文概述

图是可水平扩展, 快速, 高度可用的分布式图形数据库, 提供ACID事务, 一致的复制和可线性化的读取。

它还支持类似GraphQL的查询语法, 这对于具有更细粒度的搜索功能非常有用。

反过来, 图数据库是使用图结构(如节点和边)表示实体关系并存储数据的数据库。

GraphQL, 顾名思义, 它也是一种基于图形区域的技术。那么, 为什么不将两者混在一起呢?

如你所知, GraphQL是公开API端点而不是通常的REST的另一种健壮方法。

它是灵活的, 与语言无关的, 功能强大的, 并且得到了社区的广泛认可。但这并不意味着你必须在图形数据库中编写数据存储逻辑。

本文旨在以一种实用的方式触及这个主题。

我们将使用Dgraph创建CRUD, 然后依次为每个查询和变异生成支架方法。然后, 通过使用GraphQL Playground, 我们将对其进行测试。

设定

启动和运行Dgraph的最快方法是通过Docker。你也可以通过下载卷曲并将其添加到下面的bash中这些指示.

但是, 为简单起见, 我们将坚持Docker策略。

我们为制作了一个自定义演示.
不完全是。点击这里查看.

使用Dgraph和GraphQL创建第一个CRUD1

第一, 安装Docker如果你仍然没有它。

然后, 运行以下命令, 以获取最新的Dgraph Docker映像:

docker pull dgraph/dgraph:latest

如果需要, 还可以安装特定版本而不是最新版本。

完成后, 你可以运行以下命令来检查下载的图像:

docker images

最后, 让Dgraph启动并运行:

docker run -it -p 8080:8080 dgraph/dgraph:latest

这将在本地主机在端口8080。你可以根据需要更改端口。

确保等到消息"听..."来证明它已启动。

就是这个。设置非常简单, 下一步是向我们的Dgraph数据库提供模式。

现在, 让我们分析一下架构的外观:

type Post {
    id: ID!
    title: String! @search(by: [exact])
    content: String!
    authors: [User]
    comments: [Comment]
}

type User {
    id: ID!
    username: String! @search(by: [exact])
    name: String! @search(by: [fulltext])
    avatar_url: Url
}

type Comment {
    id: ID!
    description: String!
    likes: Int
}

type Url {
    url_address: String!
}

我们的示例将是博客文章的架构。我们将针对博客用户, 帖子和评论创建CRUD。

如果你不熟悉GraphQL模式, 建议你仔细阅读这个.

创建架构时, 请务必将其与数据库表一起考虑。每种类型都对应一个表, 该表又应具有一个ID(自动生成)。在我们的示例中, 网址类型没有ID, 因此这意味着我们必须将网址明确插入用户中。

其余字段遵循约定。你有一个类型, !定义是否需要。

这里特别注意@搜索指示。

它告诉Dgraph我们的模型需要能够搜索特定的属性值。

的精确值表示要对作为参数提供的确切字符串进行搜索, 并且全文值启用了另外两个选项, 我们将在后续操作中看到它们。

你仍然可以选择正则表达式, 它允许通过正则表达式进行过滤。

你可以阅读有关此的更多信息这里.

现在, 运行命令, 该命令将基于所看到的架构创建所有数据库结构:

curl -H "Content-Type: application/json" http://localhost:8080/admin/schema -XPOST -d $'
type Post {
    id: ID!
    title: String! @search(by: [exact])
    content: String!
    authors: [User]
    comments: [Comment]
}

type User {
    id: ID!
    username: String! @search(by: [exact])
    name: String! @search(by: [fulltext])
    avatar_url: Url
}

type Comment {
    id: ID!
    description: String!
    likes: Int
}

type Url {
    url_address: String!
}'

命令成功完成后, 你应该看到以下输出消息:

{"data":{"code":"Success", "message":"Done"}}

测验

现在是时候测试我们的示例并提供数据库博客数据了。

首先, 你需要下载并安装GraphQL游乐场工具到你的计算机。

显然, 你可以使用最适合的工具, 但我们会坚持使用Playground, 因为它很简单, 并且在服务器上更改GraphQL模式后会自动刷新。

现在, 打开它并输入http:// localhost:8080 / graphql在地址栏中。

点击 "施玛窗口右侧的""按钮, 将显示以下内容:

在Dgraph中生成的模式。

Dgraph生成的架构。

你可能会注意到, 我们提供给Dgraph命令的初始架构不是最终的架构。实际上, Dgraph将以此为默认基础, 以在每个已建立的关系上生成CRUD模式操作。

模式及其关系越复杂, 最终生成的GraphQL模式将越复杂。

Dgraph遵循以下模式加(以创建新项目), 更新(以更新现有项目), 去掉(删除), 以及得到(以检索和过滤)作为操作名称开头的前缀。

让我们以一个可以创建新评论的简单变异开始测试。这是内容:

创建一个新评论。

创建一个新评论。

为了使用此API进行调用, 你必须遵循由Dgraph确定的类型系统-Dgraph是自动生成的, 并且我们之前已经见过。

每个突变都会收到一个参数, 输入。它基本上是一系列条目, 这些条目根据你执行的操作类型而变化。例如, 要创建新评论, 你必须提供一个描述和数量喜欢.

另外请注意, 在放置结果字段之后, 我们立即返回。这是必须的。

最后, 在右侧, 你将看到结果, 包括自动生成的id值。此值很重要, 因为它是获得评论时必须使用的值。例如:

查询特定的ID。

查询特定的ID。

现在创建一个新用户。这是它的突变内容:

mutation {
  addUser(
    input: [
      {
        username: "notlogy"
        name: "notlogy"
        avatar_url: {
          url_address: "https://blog.notlogy.com/wp-content/uploads/2020/01/notlogy-blog-logo.png"
        }
      }
    ]
  ) {
    user {
      id
      username
      name
      avatar_url {
        url_address
      }
    }
    numUids
  }
}

请注意, 我们应该将头像网址内容作为一个整体类型进行显式放置。如果彼此之间有许多对象, 则也必须在此处说明它们。

这是输出:

添加新用户后的输出。

添加新用户。

查询创建的用户与注释非常相似。 Playground通过自动完成对变异和查询的可用选项实际上有很大帮助。

这是最近创建的用户的查询示例:

query {
  getUser(id: "0x6") {
    id
    username
    name
    avatar_url {
      url_address
    }
  }
}

现在, 让我们探索过滤功能.

如前所述, 它允许我们查询特定的语句或文本片段。例如, 假设你有一堆用户已经注册, 并且想用用户名" notlogy"搜索所有用户。

这将是你的查询:

query {
  queryUser(filter: { username: { eq : "notlogy" } }) {
    id
    username
    name
    avatar_url {
      url_address
    }
  }
}

的eq运算符代表等于。请记住, 这仅是可能的, 因为我们在架构中定义了用户名该字段是可搜索的(@search(作者:[精确]))。

通过确切的用户名值在GraphQL中进行查询的示例。

通过确切的用户名值查询。

换句话说, 名称字段是作为可搜索字段创建的, 但带有选项全文。该选项为我们提供了两个搜索运算符:全部文字(包含所有内容)和任何文本(至少包含其中之一)。

使用第一个选项查看查询:

query {
  queryUser(filter: { name: { alloftext: "Login" } }) {
    id
    username
    name
    avatar_url {
      url_address
    }
  }
}

这将是结果:

使用alloftext选项进行测试的示例。

使用alloftext选项进行测试。

当涉及第二个选项时, 我们得到的是:

使用anyoftext选项进行测试。

使用anyoftext选项进行测试。

现在, 我们有了一个包含两个元素的数组。 Dgraph将搜索与至少一个字符串参数匹配的任何内容。

另一个可能的查询如下:

query {
  queryPost(
    filter: { title: { eq: "bla" } }
    order: { asc: content }
    first: 2
  ) {
    id
    title
    content
    comments {
      description
      likes
    }
  }
}

插入一些帖子后, 你可以查询所有标题为" bla"的帖子, 这些帖子按其内容排序, 并找到前两个结果。

总结

这些只是Dgraph与GraphQL结合的强大功能的几个示例。它的脚手架性质有助于从零开始构建CRUD, 并使其立即启动并运行。

Dgraph为我们提供了其他有趣的功能, 例如授权和身份验证指令, 自定义解析器, 自定义字段等。

确保参考他们的官方文档更多。

监视生产中失败的和缓慢的GraphQL请求

尽管GraphQL具有一些调试请求和响应的功能, 但要确保GraphQL能够可靠地为你的生产应用程序提供资源, 将使事情变得更加棘手。如果你有兴趣确保对后端或第三方服务的网络请求成功完成,

尝试notlogy

.

使用Dgraph和GraphQL创建第一个CRUD2
LogRocket仪表板免费试用横幅

https://notlogy.com/signup/

日志火箭就像Web应用程序的DVR一样, 实际上记录了你网站上发生的一切。你可以猜测问题的GraphQL请求并进行汇总, 以快速了解根本原因, 而不必猜测为什么会出现问题。此外, 你可以跟踪Apollo客户端状态并检查GraphQL查询的键/值对。

notlogy用你的应用程序记录基线性能计时, 例如页面加载时间, 到第一个字节的时间, 缓慢的网络请求, 并记录Redux, NgRx和Vuex的操作/状态。

免费开始监控

.

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: