Dgraph、GraphQL、Schemas和CRUD-Ardan实验室

2020-05-16 02:16:51

在这篇文章的大多数评论中,有人问我为什么选择图形数据库而不是其他东西?这是一个很难回答的问题,因为我目前的经验仅限于图形数据库方面。我猜你也在想同样的事情,所以这是我迄今为止最好的回答。在我职业生涯的这个阶段,如果我在编写金融软件,我只会选择关系型数据库。关系数据库是非常严格的,所以您需要真正确保您事先了解您的数据。更改数据库是一项很大的工作,但如果设计正确,数据库将为您提供非常高级别的完整性,并且您可以获得良好的性能。这些数据库很难分发和扩展,因此最终往往会出现单个实例,这些实例非常大,需要进行复制才能进行备份。云提供商今天拥有应该可以扩展的关系数据库,但我没有使用它们的经验。我花了7年时间在MongoDB(文档数据库)上构建产品。这些数据库带来了分布式可伸缩性和大量数据灵活性的承诺。分布式可伸缩性非常复杂(因为它需要分片),而且它们从未像关系数据库那样可靠。如果数据完整性不是问题,并且您的数据不断变化,那么这些数据库非常棒。我现在正在学习Dgraph(图形数据库)和GraphQL。我真的很喜欢我看到的东西。Dgraph是一个分布式的、可伸缩的数据库,它在云中工作,并为该环境从头构建。它确实需要一个模式,以便您可以获得数据完整性,但它不那么严格,因此您可以更灵活地进行更改。Dgraph支持事务,但我还没有尝试过这一点。本文旨在帮助您快速掌握Dgraph和GraphQL。我希望这个帖子在我几个月前开始工作时就存在了。GraphQL有很多文档,但是在我理解我将在这篇文章中介绍的材料之前,这些文档对我来说都没有意义。在这篇文章中,我将教您定义GraphQL模式的基础知识,然后向您展示Dgraph从该模式生成的GraphQL CRUD API。之后,我将向您展示如何使用称为GraphQL Playround的漂亮的图形、交互式、浏览器内GraphQL IDE来访问API。在这篇文章的最后,我列出了审查者的问题和Dgraph工程团队的答案。这篇文章的灵感来自于我与Dgraph合作的一个名为“旅行”的项目。Travel项目是一个初学者工具包,类似于我用来教授围棋应用程序开发的Service项目。Travel项目专注于学习如何使用Dgraph和GraphQL在围棋中编写生产应用程序。旅游项目提供了一个城市的信息,在那里收集了四个点的数据并进行了相关。清单1 TYPE City{id:id!#MANDIRED,标量TYPE,Lookup Lat:Float!#MANDIRED,标量类型LNG:FLOAT!#MANDIRED,标量类型名称:String!@Search(by:[Exact])#MANDIRED,标量类型,可搜索咨询:咨询#非强制,自定义类型天气:天气#非强制,自定义类型地点:[Place]#非强制,自定义类型,列表}类型咨询{id:id!#MANDIRED,标量类型,查找大陆:String!#MANDIRED。标量类型COUNTRY_CODE:STRING!#MANDIRED,标量类型LAST_UPDATED:STRING#NOT-MANDIRED,标量类型消息:STRING#NOT-MANDIRED,标量类型SCORE:FLOAT!#MANDIRED,标量类型来源:String#NOT-MANDITY,标量类型}类型位置{id:id!#MANDRED,标量类型查找地址:String#NOT-MANDIRED,标量类型AVG_USER_RATING:FLOAT#NOT-MANDITY,标量类型CITY_NAME:STRING!#。标量类型LNG:FLOAT!#MANDIRED,标量类型LOCATION_TYPE:[string]#NOT-MANDIRED,标量类型,列表名称:STRING!@search(by:[Exact])#MANDIRED,可搜索NO_USER_RATING:INT#NOT-MANDIRED,标量类型PLACE_ID:STRING!#MANDIRED,标量类型PHOTO_ID:String#NOT-MANDIRED,标量类型}类型天气{id:id!#MANDIRED,标量类型,LOOKUP CITY_NAME:STRING!标量类型Feel_Like:FLOAT#非强制,标量类型湿度:INT#非强制,标量类型压力:INT#非强制,标量类型日出:INT#非强制,标量类型日落:INT#非强制,标量类型TEMP:FLOAT#非强制,标量类型TEMP_MIN:FLOAT#非强制,标量类型TEMP_MAX:FLOAT#非强制,标量类型可见性:String#NOT-MAND,标量类型WIND_DIRECTION:INT#NOT。

清单1显示了应用程序的完整GraphQL模式。我已经添加了注释,这些注释分解了模式定义中的每个字段(谓词)。这应该为您理解SYNT提供了一个很好的起点

清单12显示了用于启动和运行Dgraph的docker run命令。请注意,此版本的Dgraph不是用于生产的消息。使用此版本进行本地开发和测试。端口8080是为GraphQL公开的端口。Dgraph启动并运行后,下一步是创建模式。创建模式的最快方法是运行curl命令。清单13curl-H";Content-Type:Application/json";http://localhost:8080/admin/schema-XPOST-d$';type City{id:id!咨询:咨询LAT:彩车!液化天然气:漂浮!名称:string!@search(by:[Exact])地点:[place]weet:weet}类型咨询{id:id!大陆:弦!国家:字符串!COUNTRY_CODE:字符串!LAST_UPDATED:String消息:String分数:Float!来源:string}类型Place{id:id!地址:string AVG_USER_RATING:FLOAT CITY_NAME:STRING!gaps_url:string lat:Float!液化天然气:漂浮!location_type:[string]name:string!@search(by:[Exact])no_user_Rating:int place_id:string!Photo_id:String}类型天气{id:id!CITY_NAME:字符串!描述:string Feel_Like:浮动湿度:INT压力:INT日出:INT日落:INT TEMP:FLOAT TEMP_MIN:FLOAT TEMP_MAX:FLOAT可见性:STRING WIND_DIRECTION:INT WIND_SPEED:Float}';OUTPUT{";data";:{";code";:";Success";,";Message";:";Done";}}。

清单13显示了创建模式的curl命令。复制、粘贴并在终端中运行curl命令。完成后,您应该会看到显示的输出。GraphQL游乐场是一个图形化、交互式、浏览器内的GraphQL IDE,由Prisma创建,基于GraphiQL。这是一个很好的工具,用于验证模式和数据在数据库中是否得到正确管理。该链接提供对三大操作系统的桌面应用程序的访问。下载应用程序并使其运行后,您应该会看到以下内容。图1选择URL端点选项并在文本框中键入http://localhost:8080,如图1所示,然后点击Open按钮。图2假设您让Dgraph在清单12中运行,您应该看到没有连接错误、一个空的工作区和右侧的两个选项卡,如图2所示。由于“暗”主题非常暗,我将把主题更改为“亮”。为此,请选择应用程序右上角的齿轮图标,并将编辑器的主题设置从";暗";更改为";亮";,然后单击保存。清单14更改主题后,GraphQL游乐场应该如下所示。图3图3显示了将主题更改为灯光后GraphQL游乐场应该是什么样子。右侧的两个选项卡DOCS和SCHEMA提供模式信息。DOCS选项卡是CRUD API的交互式超链接视图。模式选项卡提供整个模式的平面视图。图4图4显示了Schema选项卡中平面模式的部分视图。该模式不仅显示您提供的数据定义,还显示由Drgaph生成的所有类型和CRUD API。有两种类型很重要,因为它们表示CRUD API。清单15类型突变{addCity(input:[AddCityInput!]!):AddCityPayload updateCity(input:UpdateCityInput!):UpdateCityPayload delete City(filter:CityFilter!):DeleteCityPayload addConsulting(input:[AddAdvisoryInput!]!):AddAdvisoryPayload updateConsulting(input:UpdateAdvisoryInput!):UpdateAdvisoryPput!

清单15显示了包含基于模式生成的突变API的突变类型。您会注意到,每种类型都有一个添加、更新和删除功能。这是因为ID谓词已添加到架构中的每种类型。清单16type query{getCity(id:id!):City queryCity(filter:CityFilter Order:CityOrder First:Int Offset:Int):[City]getConsulting(id:id!):AdvisoryFilter Order:AdvisoryOrder First:Int Offset::[AdvisoryOrder First:Int Offset:Int):[AdvisorygetPlace(id:id!):Place queryPlace(Filter:PlaceFilter Order:PlaceOrder First:Int Offset:Int):[。

清单16显示了包含基于模式生成的查询API的查询类型。您可以看到,每种类型都有一个获取和查询函数。GET函数之所以存在,是因为向架构中的每个类型添加了ID谓词。默认情况下,每种类型都有一个查询功能。不用担心索引,当查询函数第一次在特定谓词上运行时,会创建索引。