node.js - Node sequelize postgres dialect 不断创建类型为 INTEGER 而不是 SERIAL 的 id 类型:Sequelize.INTEGER 和 autoincrement: true
问题描述
我正在关注 node sequelize mysql 的教程,但我使用的是 postgresql。根据我的阅读,sequelize 包会自动将 autoincrement true 转换为 postgres 方言中的 Serial 数据类型,但对我来说,它一直在执行“id”INTEGER。
这就是我初始化续集的方式
const Sequelize = require('sequelize')
const sequelize = new Sequelize('my-database-name', 'postgres', 'mypassword', {
dialect: 'postgres',
protocol: 'postgres',
host: 'localhost',
port: '5432',
})
module.exports = sequelize
这就是我初始化模型的方式
const Sequelize = require('sequelize')
const sequelize = require('../util/database')
const Product = sequelize.define('product', {
id: {
type: Sequelize.INTEGER,
autoincrement: true,
primaryKey: true,
},
title: Sequelize.STRING,
price: {
type: Sequelize.DOUBLE,
allownull: false,
},
imageUrl: {
type: Sequelize.STRING,
allownull: false,
},
description: {
type: Sequelize.STRING,
allownull: false,
},
})
module.exports = Product
这是我运行服务器的 app.js
const path = require('path')
const express = require('express')
const bodyParser = require('body-parser')
const errorController = require('./controllers/error')
const sequelize = require('./util/database')
const app = express()
app.set('view engine', 'pug')
app.set('views', 'views')
const adminRoutes = require('./routes/admin')
const shopRoutes = require('./routes/shop')
app.use(bodyParser.urlencoded({ extended: false }))
app.use(express.static(path.join(__dirname, 'public')))
app.use('/admin', adminRoutes)
app.use(shopRoutes)
app.use(errorController.get404)
sequelize
.sync()
.then(result => {
// console.log(result)
app.listen(3000)
})
.catch(err => console.log(err))
这是我从终端得到的
[nodemon] starting `node app.js`
Executing (default): CREATE TABLE IF NOT EXISTS "products" ("id" INTEGER , "title" VARCHAR(255), "price" DOUBLE PRECISION, "imageUrl" VARCHAR(255), "description" VARCHAR(255), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH
TIME ZONE NOT NULL, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'products' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
我希望得到这个执行
Executing (default): CREATE TABLE IF NOT EXISTS "products" ("id" SERIAL PRIMARY KEY...
因为每当我添加新记录时都会出现此错误
Executing (default): INSERT INTO "products" ("id","title","price","imageUrl","description","createdAt","updatedAt") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING *;
DatabaseError [SequelizeDatabaseError]: null value in column "id" violates not-null constraint
我有 instal --save the pg and sequelize 包。这是我的 package.json
{
...
"devDependencies": {
"nodemon": "^1.18.3"
},
"dependencies": {
"body-parser": "^1.18.3",
"ejs": "^3.0.1",
"express": "^4.16.3",
"express-handlebars": "^3.1.0",
"pg": "^7.17.1",
"pug": "^2.0.4",
"sequelize": "^5.21.3"
}
}
解决方案
您不需要将 id 添加为模型的一部分,sequelize 有助于自行处理这部分。
const sequelize = require('../util/database')
const Product = sequelize.define('product', {
title: Sequelize.STRING,
price: {
type: Sequelize.DOUBLE,
allownull: false,
},
imageUrl: {
type: Sequelize.STRING,
allownull: false,
},
description: {
type: Sequelize.STRING,
allownull: false,
},
})
module.exports = Product
保持这样,它会自己处理
推荐阅读
- c# - ASP.NET CSHTML 忽略
- python - 如何在 Google Drive 中永久保存一个库并从 Google Colab 中加载它?
- firebase - Flutter Firestore:没有为“Query”类型定义方法“doc”
- javascript - 过滤不同对象内的嵌套数组并返回具有新过滤数组的对象
- node.js - Mongo $push 在它应该只添加 1 时添加了 2 个数组元素
- java - 无法解析“BeanUtils”中的方法“getProperty”
- python - 加入 DataFrame 并计算与 Date 的距离
- python - 无法从谷歌 colab 之外的 tensorflow 运行 cyclegan 示例
- asp.net-core - 在 azure devops 发布期间替换令牌
- mysql - “docker-compose up”导致“mysql 得到信号 6”