web-dev-qa-db-ja.com

JSではSequelizeはキャメルケースを使用しますが、テーブル名にはアンダースコアを使用します

列名に下線(postgres)を付けることはできますが、JavaScriptゲッターを言語標準ごとにキャメルケースにすることはできますか?

31
futbolpal

列定義では直接ではありませんが、ゲッターとセッターを確認できます。

http://sequelizejs.com/documentation#models-getters---setters-defining-as-part-of-the-model-options

このオプションでは、各列のゲッターとセッターを手動で定義する必要がありますが、自動化することはできません。さらに、ゲッターと実際の列名の両方がオブジェクトで利用可能になります。

Githubのこの機能には問題があると思いますが、今のところ見つかりません


実際のリンク http://sequelizejs.com/docs/latest/models#getters---setters

2

後でこれを見つけた人は、データベースフィールドの名前を明示的に定義できるようになりました。

var User = sequelize.define('user', {
  isAdmin: {
    type: DataTypes.BOOLEAN,
    field: 'is_admin'
  }
});
37
Mick Hansen

2019+

Sequelize v5では、underscored: true属性


const User = sequelize.define('User', {
    username: DataTypes.STRING,
    password: DataTypes.STRING
  }, {underscored: true});

http://docs.sequelizejs.com/manual/models-definition.html

1
Sebastien Horin

Sequelizeの新しいバージョンを使用すると、モデル(テーブル)とキー(フィールド)の両方でこれを実現できます。

4.29.2を使用していますが、モデルは次のようになります。

const Post = sequelize.define('post', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
      allowNull: false,
    },
    isActive: {
      type: DataTypes.BOOLEAN,
      defaultValue: true,
      allowNull: false,
      field: 'is_active',
    },
    isDeleted: {
      type: DataTypes.BOOLEAN,
      defaultValue: false,
      allowNull: false,
      field: 'is_deleted',
    },
  }, {
    indexes: [
      {
        unique: false,
        fields: ['is_active'],
      },
      {
        unique: false,
        fields: ['is_deleted'],
      },
    ],
    defaultScope: {
      where: {
        isActive: true,
        isDeleted: false,
      },
    },
  });

const PostComments = sequelize.define('postComments', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
      allowNull: false,
    },
    postId: {
      type: DataTypes.UUID,
      allowNull: false,
      field: 'post_id',
    },
    comment: {
      type: DataTypes.STRING,
      allowNull: false,
    },
  }, {
    tableName: 'post_comments',
    indexes: [
      {
        unique: false,
        fields: ['post_id'],
      },
    ],
  });


  Post.hasMany(PostComments, {
    foreignKey: 'postId',
    constraints: true,
    as: 'comments',
  });

  PostComments.belongsTo(Post, {
    foreignKey: 'postId',
    constraints: true,
    as: 'post',
  });

ご覧のとおり、モデル(テーブル)にはtableName値を、キー(フィールド)にはfield値を設定しています。

私が走ると:

sequelize.query('SET FOREIGN_KEY_CHECKS = 0', { raw: true })
  .then(() => {
    conn.sync({ force: true }).then(() => {
      console.log('DONE');
    });
  });

結果は次のとおりです。

Executing (default): SET FOREIGN_KEY_CHECKS = 0
Executing (default): DROP TABLE IF EXISTS `post_comments`;
Executing (default): DROP TABLE IF EXISTS `post`;
Executing (default): CREATE TABLE IF NOT EXISTS `post` (`id` CHAR(36) BINARY NOT NULL , `is_active` TINYINT(1) NOT NULL DEFAULT true, `is_deleted` TINYINT(1) NOT NULL DEFAULT false, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`) ENGINE=InnoDB;
Executing (default): CREATE TABLE IF NOT EXISTS `post_comments` (`id` CHAR(36) BINARY NOT NULL , `post_id` CHAR(36) BINARY NOT NULL, `comment` VARCHAR(255) NOT NULL, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
0