web-dev-qa-db-ja.com

NodeJsのSequelizeでautoIncrementはどのように機能しますか?

Sequelizeのドキュメントは、autoIncrementについてあまり詳しく述べていません。次の例のみが含まれます。

// autoIncrement can be used to create auto_incrementing integer columns
incrementMe: { type: Sequelize.INTEGER, autoIncrement: true }

この例に基づいて、次のコードがあります。

db.define('Entries', {
    id: {
        type: Seq.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    title: {
        type: Seq.STRING,
        allowNull: false
    },
    entry: {
        type: Seq.TEXT,
        allowNull: false
    }
}

エントリーを作成したいとき、次のようなことをしたいです:

models.Entry.create({title:'first entry', entry:'yada yada yada'})

ただし、そのコードを実行すると、データベースエラーが発生します。

列「id」のヌル値が非ヌル制約に違反しています

Sequelizeが整数を入力するか、データベーステーブルを定義してそれを行うと仮定します。どうやら? IDが自動的に増分され、入力されるようにするために、ここで何が欠けていますか?

どうもありがとう。

32
Eric H.

通常、Sequelize.jsはデータベースに適応します。そのため、autoincrement属性はPostgreSQLのシリアルタイプに対応しています。

私はすでにSequelizeで働いていましたが、覚えているのは、主キーとしてidを指定する必要がないということです。 Sequelizeはあなたのためにそれを行います。

Id属性を追加しないで、Sequelizeが追加しないかどうかを確認してください。

22
Yacine Rezgui

omitNull configオプションはデフォルトでfalseです。 trueに設定すると、idがPostgresによって処理されます。

sequelize = new Sequelize('mydb', 'postgres', null, {
  Host: 'localhost',
  port: 5432,
  dialect: 'postgres',
  omitNull: true
})

Visitor = sequelize.define('visitor', {
  email: Sequelize.STRING
})

Visitor.create({email: '[email protected]'})
10
mxgrn

次のようなモデルに「id」フィールドを手動で追加した場合(この場合、Sequelizeは自動的に追加しません)、それは私にとってはうまくいきました:

Visitor = sequelize.define('visitor', {
  id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
  },
  email: Sequelize.STRING
})

結果SQLコマンドは、「CREATE TABLE IF NOT EXISTS "visitor"( "id" SERIAL、 "email" varchar(255)...」です。

0
AdelaF