Sfoglia il codice sorgente

MySQL 向 GraphQL 迁移

willin 8 anni fa
parent
commit
a3ff4f2193
2 ha cambiato i file con 198 aggiunte e 0 eliminazioni
  1. 1 0
      _sidebar.md
  2. 197 0
      experience/advanced/mysql-graphql.md

+ 1 - 0
_sidebar.md

@@ -86,6 +86,7 @@
     - [混合Web应用实践](experience/advanced/mixed-project.md)
     - [基于接口快速搭建前后分离项目](experience/advanced/webapp-proxy.md)
     - [Vue + Koa前后端分离实践](experience/advanced/vue-webapp.md)
+    - [MySQL向GraphQL迁移](experience/advanced/mysql-graphql.md)
 - 思想篇
   - 能力
     - [好员工的定义](mind/capability/define-good-employee.md)

+ 197 - 0
experience/advanced/mysql-graphql.md

@@ -0,0 +1,197 @@
+# MySQL 向 GraphQL 迁移
+
+GraphQL 是一个开源的图形数据库(基于Node.js实现), 中文文档: <https://graphql.js.cool/>
+
+## `sequelize-auto` 将 MySQL 数据库转变成模型
+
+```
+[node] sequelize-auto -h <host> -d <database> -u <user> -x [password] -p [port]  --dialect [dialect] -c [/path/to/config] -o [/path/to/models] -t [tableName] -C
+
+参数:
+  -h, --host        主机地址 [必须]
+  -d, --database    数据名 [必须]
+  -u, --user        用户名
+  -x, --pass        密码
+  -p, --port        端口号
+  -c, --config      配置文件,参考: https://sequelize.readthedocs.org/en/latest/api/sequelize/
+  -o, --output      输出目录
+  -e, --dialect     数据库引擎: postgres, mysql, sqlite
+  -t, --tables      需要导入的表
+  -T, --skip-tables 需要排除的表
+  -C, --camel       使用用驼峰命名法
+  -n, --no-write    不需要写入文件
+  -s, --schema      数据库结构
+```
+
+## 使用数据模型
+
+这里是生成的一个示例模型:
+
+```js
+/* jshint indent: 2 */
+
+module.exports = function(sequelize, DataTypes) {
+  return sequelize.define('d_user', {
+    uid: {
+      type: DataTypes.INTEGER(11).UNSIGNED,
+      allowNull: false,
+      primaryKey: true
+    },
+    username: {
+      type: DataTypes.STRING(16),
+      allowNull: false,
+      defaultValue: ''
+    },
+    mobile: {
+      type: DataTypes.STRING(16),
+      allowNull: false,
+      defaultValue: ''
+    },
+    email: {
+      type: DataTypes.STRING(32),
+      allowNull: false,
+      defaultValue: ''
+    },
+    password: {
+      type: DataTypes.STRING(32),
+      allowNull: false,
+      defaultValue: ''
+    },
+    salt: {
+      type: DataTypes.STRING(8),
+      allowNull: false,
+      defaultValue: ''
+    },
+    updatedAt: {
+      type: DataTypes.INTEGER(10).UNSIGNED,
+      allowNull: false
+    }
+  }, {
+    tableName: 'user'
+  });
+};
+```
+
+创建数据库模型:
+
+```js
+const Sequelize = require('sequelize');
+
+const Db = new Sequelize('数据库名', '用户名', '密码', {
+  host: 'localhost',
+  dialect: 'mysql'
+})
+
+const User = Db.define('user', {
+  uid: {
+    type: Sequelize.INTEGER(11).UNSIGNED,
+    allowNull: false,
+    primaryKey: true
+  },
+  username: {
+    type: Sequelize.STRING(16),
+    allowNull: false,
+    defaultValue: ''
+  },
+  mobile: {
+    type: Sequelize.STRING(16),
+    allowNull: false,
+    defaultValue: ''
+  },
+  email: {
+    type: Sequelize.STRING(32),
+    allowNull: false,
+    defaultValue: ''
+  },
+  password: {
+    type: Sequelize.STRING(32),
+    allowNull: false,
+    defaultValue: ''
+  },
+  salt: {
+    type: Sequelize.STRING(8),
+    allowNull: false,
+    defaultValue: ''
+  }
+}, {
+    tableName: 'user',
+    // 取消默认的时间戳, 否则会报 createdAt 不存在错误
+    timestamps: false
+});
+
+Db.sync();
+
+module.exports = {
+  Db,
+  User
+};
+```
+
+## `graphql-sequelize` 转换 MySQL -> GraphQL 结构
+
+```js
+const { GraphQLObjectType,GraphQLSchema,GraphQLList,GraphQLInt,GraphQLString } = require('graphql');
+const { attributeFields, resolver } = require('graphql-sequelize');
+const { Db, User } = require('./db');
+
+userType = new GraphQLObjectType({
+  name: 'User',
+  description: 'A user',
+  fields: attributeFields(User)
+});
+
+const Query = new GraphQLObjectType({
+  name: 'Query',
+  description: 'Root query object',
+  fields: () => {
+    return {
+      user: {
+        type: new GraphQLList(userType),
+        args: {
+          uid: {
+            type: GraphQLInt
+          },
+          email: {
+            type: GraphQLString
+          }
+        },
+        resolve(root, args) {
+          return Db.models.user.findAll({ where: args });
+        }
+      }
+    };
+  }
+});
+
+const Schema = new GraphQLSchema({
+  query: Query
+});
+
+module.exports = Schema;
+```
+
+## 启动服务器
+
+```js
+
+const Express =require( 'express');
+const GraphHTTP =require( 'express-graphql');
+const Schema =require( './schema');
+
+// Config
+const APP_PORT = 3000;
+
+// Start
+const app = Express();
+
+// GraphQL
+app.use('/graphql', GraphHTTP({
+  schema: Schema,
+  pretty: true,
+  graphiql: true
+}));
+
+app.listen(APP_PORT, ()=> {
+  console.log(`App listening on port ${APP_PORT}`);
+});
+```