Узел sequelize postgres диалект продолжает создавать идентификатор типа INTEGER вместо SERIAL для типа: Sequelize.INTEGER и автоинкремента: true - PullRequest
1 голос
/ 12 января 2020

Я следую учебному пособию для узла sequelize mysql, но я использую postgresql. Из того, что я прочитал, пакет sequelize автоматически преобразует автоинкремент true в тип данных Serial на диалекте postgres, но для меня он продолжает выполнять "id" INTEGER.

Вот как я инициализирую sequelize

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

Это мое приложение. 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

У меня есть установка - сохранить пакет pg и sequelize. Вот мой пакет. 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"
  }
}

1 Ответ

1 голос
/ 13 января 2020

Вам не нужно добавлять идентификатор как часть вашей модели, 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

Держите это так, он справится сам

...