mysql - 使用 Sequelize 从 MySQL 获取数据到 GraphQL 失败

标签 mysql node.js sequelize.js graphql

首先,这是我在 MySQL 上的表

+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| MemberID  | int(11)     | NO   | PRI | NULL    | auto_increment |
| FirstName | varchar(50) | NO   |     | NULL    |                |
| LastName  | varchar(50) | NO   |     | NULL    |                |
| CityID    | int(11)     | NO   | MUL | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

我使用 Sequelize 创建了一个从我的 Node JS 服务器到 MySQL 的连接,如下所示:

var db = new Sequelize(
  'member','root', null,
  {
    host    : 'localhost',
    port    :  3306,
    dialect : 'mysql'
  }
);

然后我使用 Sequelize 在我的 Node JS 服务器上定义了我的 MySQL 表,如下所示:

var memberlist = db.define('members', {
    MemberID  : Sequelize.INTEGER,
    FirstName : Sequelize.STRING,
    LastName  : Sequelize.STRING
});

然后我制作了一个 GraphQL 模式来获取数据以及该模式的相应解析器

 var schema = buildSchema(`

    type Members {
      MemberID: ID!
      FirstName: String!
      LastName: String!
      CityID: City!
    }

    type City {
      CityID: ID!
      CityName: String!
    }

    type Query {
      allMembers: [Members]!
    }
`);

 var root = {

    allMembers  : function(){
       memberlist.find({}).complete(function (err,data) 
       {}).then(({data}) => data)},

 }

var app = express();
 app.use('/graphql', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true
}));

当我尝试在 GraphQL 上运行查询时,出现以下错误:

Executing (default): SELECT `id`, `MemberID`, `FirstName`, `LastName`, 
`createdAt`, `updatedAt` FROM `members` AS `members` LIMIT 1;

Unhandled rejection SequelizeDatabaseError: Unknown column 'id' in 'field 
list'

id(和createdAtupdateAt)字段是从哪里来的,因为我没有在 Sequelize 上定义它们?

最佳答案

我在这里假设,如果您没有明确告诉 sequelize 模型中的主键是什么,它会假定它是一个名为 id

的字段

尝试以下方法告诉 sequelize 你的主键是什么;

const memberlist = db.define('members', {
  MemberID  : {
    type: DataTypes.INTEGER,
    primaryKey: true,
  }
  FirstName : Sequelize.STRING,
  LastName  : Sequelize.STRING
});

createdAt 和 updatedAt 字段会自动为您添加。要阻止这种情况发生,请使用

const memberlist = db.define('members', {
  MemberID  : {
    type: DataTypes.INTEGER,
    primaryKey: true,
  }
  FirstName : Sequelize.STRING,
  LastName  : Sequelize.STRING
}, {
  timestamps: false
});

关于mysql - 使用 Sequelize 从 MySQL 获取数据到 GraphQL 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363861/

相关文章:

php - 如何使用ckeditor更新php ajax中的textarea值?

javascript - JS 脚本在 Pug 和 Jade 文件中的位置重要吗?

javascript - Sequelize 。如何查找多个参数

mysql - 选择列值不等于其他表中其他列值的结果

mysql - 如何使用mysql上最有效的方法生成最后一个表?

node.js - Sails 在两个模型中插入相同的对象

mongodb - 我可以/应该在 Mongoose 中索引嵌入的文档吗?

mysql - 通过sequelize添加另一个模型的属性和值

node.js - 使用 Express req.query 序列化查询

mysql - 检索用户好友的帖子,每个好友只有一行