使用 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
(和createdAt
、updateAt
)字段是从哪里来的,因为我没有在 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 无法从 Node/express 应用程序同步到 docker 容器中的 MySQL (ECONNREFUSED)