Sequelizeに特異なテーブル名を使用させる方法


109

Userというモデルがありますが、SequelizeはDBに保存しようとするたびにUSERSテーブルを探します。特異なテーブル名を使用するようにSequelizeを設定する方法を誰かが知っていますか?ありがとう。


3
userは予約語です。その名前で実際にテーブルを作成しようとすると、多くの問題が発生します。
a_horse_with_no_name 2014年

1
user予約語ではなく、キーワードです。使用して問題が発生することはありませんが、回避することをお勧めします。dev.mysql.com/doc/refman/5.5/en/keywords.html
ニーマル

回答:


224

ドキュメントは、プロパティを使用することができると述べていますfreezeTableName

この例を見てください:

var Bar = sequelize.define('Bar', { /* bla */ }, {
  // don't add the timestamp attributes (updatedAt, createdAt)
  timestamps: false,

  // don't delete database entries but set the newly added attribute deletedAt
  // to the current date (when deletion was done). paranoid will only work if
  // timestamps are enabled
  paranoid: true,

  // don't use camelcase for automatically added attributes but underscore style
  // so updatedAt will be updated_at
  underscored: true,

  // disable the modification of tablenames; By default, sequelize will automatically
  // transform all passed model names (first parameter of define) into plural.
  // if you don't want that, set the following
  freezeTableName: true,

  // define the table's name
  tableName: 'my_very_custom_table_name'
})

2
リンクが壊れていたため、質問のリンクを更新しました。よろしくお願いします。
マリアイネスパルニサリ

1
freezeTableName: true最新バージョンのsequelizeでは動作しません。他の解決策はありますか?
ムハンマドヤシル

2
一つの欠点はfreezeTableName、それがあることでも、テーブル名とカラム名を小文字にからsqlzを防ぐことができます。つまり、後で、データを掘り下げるためにSQLを手書きするときに、大文字と小文字が混在する名前に対応する必要があります(方言の意味が何であれ)。pgでは、大文字と小文字が混在するすべての名前を二重引用符で囲む必要があります-yuk!複数化をオプトアウトできるようにしたいのですdefineが、大文字と小文字の折りたたみを保持しtableNameます... 明示的に上書きするオプションがあります。
トム

1
freezeTableName: true追加で使用modelName: 'singularName'
Naor Levi

97

受け入れられた答えは正しいですが、これをすべてのテーブルに対して1回行うことができます。テーブルごとに個別に行う必要はありません。次のように、同様のオプションオブジェクトをSequelizeコンストラクタに渡すだけです。

var Sequelize = require('sequelize');

//database wide options
var opts = {
    define: {
        //prevent sequelize from pluralizing table names
        freezeTableName: true
    }
}

var sequelize = new Sequelize('mysql://root:123abc@localhost:3306/mydatabase', opts)

エンティティを定義するときに、次のように指定する必要はありませんfreezeTableName: true

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})

3
ヘッドアップをありがとう、ここに興味のある人のためのドキュメントへのリンクがあります
ozanmuyes

0

単数形と複数形の定義に異なるモデル名が必要な場合は、モデルのオプションでパラメーターとして名前を渡すことができます。

この例を見てください:

    const People = sequelize.define('people', {
    name: DataTypes.STRING,
}, {
    hooks: {
        beforeCount (options) {
            options.raw = true;
        }
    },
    tableName: 'people',
    name: {
        singular: 'person',
        plural: 'people'
    }
});

これは、単一のレコードが照会されている場合は「人」をオブジェクトとして返し、複数のレコードをフェッチする場合は「人」を配列として返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.