web-dev-qa-db-ja.com

MySqlデータベースでprimaryKeyをUUIDとしてシーケンス化-機能しない

私は主キーをuuidとして、Sequalizeの実装モデルの問題に直面しています。私はすべての指示を段階的に実行しますが、それでも解決できません。

これは私のモデルがどのように見えるかです:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Todo = sequelize.define('Todo', {
    title: DataTypes.STRING,
    description: DataTypes.STRING,
    test: DataTypes.UUID
  }, {});
  Todo.associate = function(models) {
    // associations can be defined here
  };
  return Todo;
};

そして移行ファイル:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Todos', {
      id: {
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV1
      },
      title: {
        type: Sequelize.STRING
      },
      description: {
        type: Sequelize.STRING
      },
      test: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Todos');
  }
};

要素を作成するためにpostメソッドを呼び出した後、ID列に空の値があり、テスト列にNULLがあります...

日付ベースはMySqlです。

それを行う他の方法はありますか?

6
agims7

1)Sequelizeでカスタムキーを設定する

私は主キーをuuidとしてSequalizeの実装モデルの問題に直面しています。

デフォルトでは、モデルしないprimaryKey: trueのキーが含まれる場合、sequelizeINTEGERという名前のidという名前のPKを想定します。

あなたの場合、あなた自身のカスタムPKを作成したいようです。

次のモデル内を使用します。

var Todo = sequelize.define('Todo', {
    id: {
      primaryKey: true,
      type: DataTypes.UUID
    }
    // rest of properties
 });

2)検証

Postメソッドを呼び出して要素を作成した後、ID列に空の値があり、テスト列にNULLがあります...

クエリだけでなく、データベースのシード方法に関する多くの情報がなければ、具体的に答えることは困難です。

ただし、検証をリストしていないので、test列がnullだったとしても驚きません。したがって、test値を設定しない行をシードまたは作成すると、nullになります。

検証を作成するには、次の手順を実行します

モデル:

var Todo = sequelize.define('Todo', {
    // rest of properties
    test: {
      allowNull: false
      type: DataTypes.UUID,
      validate: {
        notNull: true
      }
    }
});

移行:

queryInterface.createTable('Todos', {
    // rest of properties
    test: {
      allowNull: false,
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4
    }
});

3)モデルと移行の同期を保つ

(参照: https://stackoverflow.com/a/49796801/8954866sequelizeでは、モデルと移行は、最初にを使用して生成された場合を除き、互いに自動的に同期しませんsequelize-cli model:generate。移行を実行したのか、モデルに対する単体テストでクエリを実行していたのかはわかりません。ただし、それらが同期していることを確認する必要があります。主な例は、上記の場合、移行でidUUIDタイプであると示されていますが、モデルはINTEGERタイプであると見なします。

参照

10
vapurrmaid