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

Posted

技术标签:

【中文标题】使用 Sequelize 从 MySQL 获取数据到 GraphQL 失败【英文标题】:Fetching data from MySQL to GraphQL using Sequelize failed 【发布时间】:2018-06-30 00:54:59 【问题描述】:

首先,这是我在 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 Schema 来获取数据以及该模式的相应解析器

 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 列。但这可以解释为什么 id 那里,而不是为什么它不在那里。 您应该在使用 Sequelize 定义表时定义 primary key。 sequelize table without column 'id' 的可能重复项 【参考方案1】:

我在这里假设如果你没有明确告诉 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
);

【讨论】:

以上是关于使用 Sequelize 从 MySQL 获取数据到 GraphQL 失败的主要内容,如果未能解决你的问题,请参考以下文章

mySQL/Sequelize - 如何查询以获取字段为空数组的数据

sequelize.query() 两次返回相同的结果

何时在 MYSQL 中使用 Sequelize?

Sequelize 无法从 Node/express 应用程序同步到 docker 容器中的 MySQL (ECONNREFUSED)

如何在 MySql 中使用 sequelize 运行多个原始查询?

如何使用 Sequelize 从 GEOMETRY('POINT') 获取纬度/经度坐标?