首页 > 解决方案 > 为什么 sequelize 没有为 postgresql 创建表中的所有列

问题描述

我正在为我的博客创建一个数据库模块。我为此使用 nodejs 和 sequelize 模块。我使用的数据库是 Postgresql。

这是续集初始化。

'use strict'

const Sequelize = require('sequelize')

// Creating a singletone
let sequelize = null

module.exports = function setupDatabase (config) {
  if (!sequelize) {
    sequelize = new Sequelize(config)
  }

  return sequelize
}

单例用于评估是否已经创建了前一个 sequelize 实例。

然后我有一个脚本配置:

'use strict'

const debug = require('debug')('diesanromero:db:setup')
const inquirer = require('inquirer')
const chalk = require('chalk')

const db = require('./')

const prompt = inquirer.createPromptModule()

async function setup () {
  const answer = await prompt([
    {
      type: 'confirm',
      name: 'setup',
      message: 'This will destroy your database, are you sure?'
    }
  ])

  if (!answer.setup) {
    return console.log('Nothing happend :)')
  }

  const config = {
    database: process.env.DB_NAME || 'blog',
    username: process.env.DB_USER || 'user',
    password: process.env.DB_PASS || 'password',
    host: process.env.DB_HOST || 'localhost',
    dialect: 'postgres',
    logging: s => debug(s),
    setup: true
  }

  await db(config).catch(handleFatalError)

  console.log('Success!')
  process.exit(0)
}

function handleFatalError (err) {
  console.error(`${chalk.red('[Fatal Error]')} ${err.message}`)
  console.error(err.stack)
  process.exit(1)
}

setup()

那是使用先前配置创建数据库的脚本。显然所有这些工作正常。数据库连接成功。然后我有三个模型。

文章.js

'use strict'

const Sequelize = require('sequelize')
const setupDatabase = require('../lib/db')

module.exports = function setupArticleModel (config) {
  const sequelize = setupDatabase(config)

  const stringRequired = {
    type: Sequelize.STRING,
    allowNull: false
  }

  const numberDefault = {
    type: Sequelize.INTEGER,
    allowNull: false,
    default: 0
  }

  return sequelize.define('article', {
    title: stringRequired,
    slug: stringRequired,
    description: stringRequired,
    content: stringRequired,
    likes: numberDefault,
    shares: numberDefault
  })
}

用户.js

'use strict'

const Sequelize = require('sequelize')
const setupDatabase = require('../lib/db')

module.exports = function setupAuthModel (config) {
  const sequelize = setupDatabase(config)

  const stringRequired = {
    type: Sequelize.STRING,
    allowNull: false
  }

  return sequelize.define('user', {
    name: stringRequired,
    username: stringRequired,
    email: stringRequired
  })
}

auth.js

'use strict'

const Sequelize = require('sequelize')
const setupDatabase = require('../lib/db')

module.exports = function setupUserModel (config) {
  const sequelize = setupDatabase(config)

  const stringRequired = {
    type: Sequelize.STRING,
    allowNull: false
  }

  return sequelize.define('auth', {
    salt: stringRequired,
    hash: stringRequired,
    email: {
      type: Sequelize.INTEGER,
      allowNull: false
    }
  })
}

然后是我的主文件index.js

'use strict'

const defaults = require('defaults')

const setupDatabase = require('./lib/db')
const setupUserModel = require('./models/user')
const setupArticleModel = require('./models/article')

module.exports = async function (config) {
  config = defaults(config, {
    dialect: 'sqlite',
    pool: {
      max: 10,
      min: 0,
      idle: 10000
    },
    query: {
      raw: true
    }
  })

  const sequelize = setupDatabase(config)
  const UserModel = setupUserModel(config)
  const AuthModel = setupAuthModel(config)
  const ArticleModel = setupArticleModel(config)

  UserModel.hasMany(ArticleModel)
  UserModel.hasOne(AuthModel)
  ArticleModel.belongsTo(UserModel)
  AuthModel.belongsTo(UserModel)

  await sequelize.authenticate()

  if (config.setup) {
    await sequelize.sync({ force: true })
  }

  const User = {}
  const Auth = {}
  const Article = {}

  return {
    User,
    Auth,
    Article
  }
}

此主文件与sequelize.authentication成功连接,然后执行迁移。请注意,用户模型与身份验证模型是一对一的关系。那么 User 模型与 Article 模型是一对多的关系。

碰巧 ORM 不会在各个表中创建所有列。有些如果创建了,有些则没有。

标签: node.jspostgresqlmodelsequelize.js

解决方案


推荐阅读