尝试使用GraphQL Mesh来通过GraphQL操作MySQL数据库
首先
GraphQL Mesh是一个用于构建将多个后端服务捆绑在一起的GraphQL网关的框架。由于关于GraphQL Mesh本身的详细信息在世界上有很多文章,我们将省略不谈。
这次我们将尝试使用GraphQL Mesh来包装MySQL并使用GraphQL来处理它。通过使用GraphQL Mesh,我们可以自动生成并处理来自已有数据库的信息,而无需自行准备模式。
将以下步骤本地执行
本次將使用GraphQL Mesh作為本地的dev伺服器,並嘗試操作任何MySQL數據庫。
请准备好的东西。
-
- ローカルからアクセス可能なMySQLサーバー
検証用に適当なデータベースとテーブルを作っておく
今回はMySQL8.0を使っています
安装所需的软件包
创建一个适当的目录,并在其中安装所需的软件包。
$ yarn add graphql @graphql-mesh/cli @graphql-mesh/mysql
创建.meshrc.yml文件
将名为.meshrc.yml的设置文件添加到刚刚创建的目录中,并写入其内容。
sources:
- name: MySQL #任意のName
handler:
mysql:
host: localhost #MySQLサーバーのホスト
port: 3306 #ポート番号
user: root #ユーザー名 今回は検証用にrootでアクセスする
password: password #パスワード
database: MyDatabase # 作成したDB名
通过将handler设置为MySQL,Mesh可以自动读取数据库定义,并为数据库操作提供必要的GraphQL模式。此外,您还可以通过在host、port等信息之后,用数组描述tables和tableFields来限制以白名单形式访问的区域。(不幸的是,似乎无法进行只读或禁止删除等详细的限制。)
启动 dev 服务器
启动 GraphQL Mesh 的开发服务器。
$ yarn mesh dev
如果执行成功,浏览器将自动打开localhost:4000,并启动GraphiQL。
如果失败,请确认已安装所需的软件包并确保与MySQL服务器通信正常。
确认架构
正如我在序言中所写的那样,由于这些模式在与数据库连接时会自动生成,因此无需在GraphQL Mesh中进行管理。
尝试执行查询。
在画面中央的框中输入查询语句,并尝试获取行数据。
顺便提一下,虽然官方文档中给出了类似get${表名}这样的示例定义,但实际上只需要定义表名即可。
{
test_table(
limit: 1,
where: {
id: "1"
}
) {
id
name
comment
}
}
在GraphQL中,可以看到类似于MySQL的limit和where,它们的行为与MySQL查询完全相同。根据官方文档,这些GraphQL模式将被转换为相应的MySQL查询并发送到数据库。根据上述示例,似乎会被转换为以下查询。
SELECT id, name, comment FROM test_table
WHERE id = '1'
LIMIT 1;
基本上只需按照提供的模式进行描述,就像MySQL查询一样可以获取行。根据CodeSandbox上提供的例子,它似乎支持JOIN语句和等效的获取方法,因此即使有一定复杂的内容,也应该能够处理。
试着执行突变。
在MySQL中,UPDATE、INSERT和DELETE的相当术语是Mutation。由于每个表都定义了相应命令的模式,因此需要根据需要使用相应模式。
这次将执行UPDATE操作。
mutation update {
update_test_table(test_table: {
name: "updated",
comment: "変更します"
},
where: {
id: "1"
}) {
name
comment
}
}
关于Mutation也可以按照提供的模式描述来操作数据库,就像Query一样。INSERT和DELETE也可以通过以下方式描述来执行。
mutation insert {
insert_test_table(test_table: {
id: "2",
name: "second",
comment: "テスト"
}) {
id
name
comment
}
}
mutation delete {
delete_test_table(
where: {
id: "2"
})
}
悬念点
就现在而言,个人觉得存在一些值得关注的问题。
-
- 単体では、認可の仕組みを持てない。
参照できるテーブルとカラム以外に関しては、これ単体では制御できないので、パブリックな場で公開するようなサービスで使う場合は誰に触られても良いような領域でしか使わない、もしくは別でそのあたりを制御する仕組みを用意する必要がありそうです。
INSERTがAUTO_INCREMENTに対応していない。
idをAUTO_INCREMENTかつNOT NULLにするというのはかなりよくあるケースだと思うのですが、insertのMutationを実行時にidが無指定だとエラーになって怒られてしまいます。ここは中々不便。
トランザクションが使えない。
構造的に当然といえば当然ですが、トランザクションが使えないので複雑な更新処理などは難しいです。
总结
这篇文章介绍了通过GraphQL Mesh来操作MySQL的方法。(我觉得将MySQL用GraphQL包装起来可能是一个相对小众的需求,但是)由于它不需要实现和管理模式,所以非常容易使用,对于狭小领域或个人使用来说,它是一个方便的工具选择。