Trước khi đọc bài viết thì mình muốn mọi người biết rằng đây chỉ là bài dịch ngẫu hứng trong thời gian rảnh. Nếu các bạn thấy đọc khó hiểu thì hãy vào bài viết gốc của docs trên trang sequelize ở đường link này. Phiên bản mình dịch là Sequelize V6
]
Lý thuyết Sequelize (phần I)
Lý thuyết cơ bản về model
I/ Khái niệm
Model chính là class đại diện cho bảng trong database. Để khai báo được bảng thì cần có những KIỂU DỮ LIỆU. Trong javascript thì không có những thứ đó nên Sequelize có hỗ trợ cho nhiều loại kiểu dữ liệu.
Sequelize hỗ trợ tạo sẵn bảng với dạng số nhiều của tên model. Ví dụ Model tên là User thì bảng trong database sẽ tên là Users.
Và nếu bảng là Person thì Sequelize cũng sẽ tự hiểu dạng số nhiều là People nhờ vào thư viện inflection
Tên Model và tên bảng đều có thể thay đổi được.
II/ Cách khai báo Model
Sau đây là code mẫu sử dụng cả 2 cách sequelize và thừa hưởng class
- Sử dụng
sequelize.define
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">const</span> <span class="token punctuation">{</span> Sequelize<span class="token punctuation">,</span> DataTypes <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'sequelize'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> sequelize <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sequelize</span><span class="token punctuation">(</span><span class="token string">'sqlite::memory:'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> User <span class="token operator">=</span> sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// Model attributes are defined here</span> firstName<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> allowNull<span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> lastName<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span> <span class="token comment">// allowNull defaults to true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// Other model options go here</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// `sequelize.define` also returns the model</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>User <span class="token operator">===</span> sequelize<span class="token punctuation">.</span>models<span class="token punctuation">.</span>User<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> |
- Sử dụng thừa hưởng class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">const</span> <span class="token punctuation">{</span> Sequelize<span class="token punctuation">,</span> DataTypes<span class="token punctuation">,</span> Model <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'sequelize'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> sequelize <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sequelize</span><span class="token punctuation">(</span><span class="token string">'sqlite::memory:'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> User<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// Model attributes are defined here</span> firstName<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> allowNull<span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> lastName<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span> <span class="token comment">// allowNull defaults to true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// Other model options go here</span> sequelize<span class="token punctuation">,</span> <span class="token comment">// We need to pass the connection instance</span> modelName<span class="token operator">:</span> <span class="token string">'User'</span> <span class="token comment">// We need to choose the model name</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// the defined model is the class itself</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>User <span class="token operator">===</span> sequelize<span class="token punctuation">.</span>models<span class="token punctuation">.</span>User<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> |
III/ Cẩn thận code shadowing
Nếu như sử dụng phương pháp thứ 2 là thừa hưởng class thì không nên khai báo trùng thuộc tính trong class mà model thừa hưởng.
Ví dụ không nên: (class Model đã có thuộc tính id, class User khai báo thêm thuộc tính id sẽ bị viết đè lên và mất setter getter)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token comment">// Invalid</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> id<span class="token punctuation">;</span> <span class="token comment">// this field will shadow sequelize's getter & setter. It should be removed.</span> otherPublicField<span class="token punctuation">;</span> <span class="token comment">// this field does not shadow anything. It is fine.</span> <span class="token punctuation">}</span> User<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> autoIncrement<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> primaryKey<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> sequelize <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> user<span class="token punctuation">.</span>id<span class="token punctuation">;</span> <span class="token comment">// undefined</span> |
Ví dụ nên:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">// Valid</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> otherPublicField<span class="token punctuation">;</span> <span class="token punctuation">}</span> User<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> autoIncrement<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> primaryKey<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> sequelize <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> user<span class="token punctuation">.</span>id<span class="token punctuation">;</span> <span class="token comment">// 1</span> |
IV/ Thay đổi tên bảng
- Bắt buộc tên bảng y chang tên model:
Bằng cách sử dụng option freezeTableName: true
Ví dụ:
1 2 3 4 5 6 | sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// ... (attributes)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> freezeTableName<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Hoặc khai báo lựa chọn này khi khai báo sequelize ở đầu file
1 2 3 4 5 6 | <span class="token keyword">const</span> sequelize <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sequelize</span><span class="token punctuation">(</span><span class="token string">'sqlite::memory:'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> define<span class="token operator">:</span> <span class="token punctuation">{</span> freezeTableName<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Cung cấp tên bảng trực tiếp
Cung cấp tên bảng khi khai báo model:
1 2 3 4 5 6 | sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// ... (attributes)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> tableName<span class="token operator">:</span> <span class="token string">'Employees'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
V/ Đồng bộ model
- Đồng bộ từng cái
Khi định nghĩa một model, tức là bạn đang nói cho Sequelize một vài điều về bảng của nó trong cơ sở dữ liệu. Tuy nhiên, nếu bảng thực sự không tồn tại ? Nếu nó tồn tại, nhưng nó có các cột khác nhau, ít cột hơn hoặc bất kỳ sự khác biệt nào?
Đây là lúc đồng bộ hóa model bước vào. Một model có thể được đồng bộ hóa với cơ sở dữ liệu bằng cách gọi model.sync(options)
, một hàm không đồng bộ (trả về một Promise ). Với lệnh gọi này, Sequelize sẽ tự động thực hiện truy vấn SQL tới cơ sở dữ liệu. Lưu ý rằng điều này chỉ thay đổi bảng trong cơ sở dữ liệu, không thay đổi model ở phía JavaScript.
User.sync()
– Tạo bảng nếu nó không tồn tại (và không làm gì nếu nó đã tồn tại)User.sync({ force: true })
– Tạo bảng, xóa bảng nếu bảng đã tồn tại rồi tạo bảngUser.sync({ alter: true })
– Kiểm tra trạng thái hiện tại của bảng trong cơ sở dữ liệu (cột nào tồn tại, kiểu dữ liệu của chúng, v.v.), sau đó thực hiện các thay đổi cần thiết trong bảng để khiến bảng phù hợp với model.
Ví dụ:
1 2 3 | <span class="token keyword">await</span> User<span class="token punctuation">.</span><span class="token function">sync</span><span class="token punctuation">(</span><span class="token punctuation">{</span> force<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"The table for the User model was just (re)created!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Đồng bộ tất cả
Bằng cách sử dụng lệnh sequelize.sync()
để tự động đồng bộ tất cả model.
Ví dụ:
1 2 3 | <span class="token keyword">await</span> sequelize<span class="token punctuation">.</span><span class="token function">sync</span><span class="token punctuation">(</span><span class="token punctuation">{</span> force<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"All models were synchronized successfully."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
VI/ Drop bảng
Để có thể drop bảng có liên hệ với lại một model ta chạy lệnh .drop()
:
1 2 3 | <span class="token keyword">await</span> User<span class="token punctuation">.</span><span class="token function">drop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"User table dropped!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
hoặc drop toàn bộ bảng ta chạy:
1 2 3 | <span class="token keyword">await</span> sequelize<span class="token punctuation">.</span><span class="token function">drop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"All tables dropped!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Tuy nhiên drop bảng hoặc đồng bộ bằng phương pháp force
, alter
là KHÔNG KHUYẾN CÁO trong PRODUCTION.
VII/ Timestamps
Mặc định, sequelize sẽ thêm vào hai cột createAt
và updateAt
cho từng model với loại dữ liệu là DataTypes.DATE
.
Chú ý: Những field này được cập nhật tự động bởi Sequelize. Do đó tất cả những cập nhật sử dụng Queries thường sẽ không kích hoạt tác dụng này. Mà phải cập nhật sử dụng hàm có sẵn của Sequelize.
Hành vi này có thể được tắt đi bởi lệnh:
1 2 3 4 5 6 | sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment">// ... (attributes)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> timestamps<span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Hoặc là ta cũng có thể enable thằng nào mà mình thích bằng lệnh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">class</span> <span class="token class-name">Foo</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> Foo<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">/* attributes */</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> sequelize<span class="token punctuation">,</span> <span class="token comment">// don't forget to enable timestamps!</span> timestamps<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token comment">// I don't want createdAt</span> createdAt<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment">// I want updatedAt to actually be called updateTimestamp</span> updatedAt<span class="token operator">:</span> <span class="token string">'updateTimestamp'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
VIII/ Cú pháp ngắn để định nghĩa cột
Nếu như chỉ muốn định nghĩa type của một cột thì ta có thể viết:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">// This:</span> sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Can be simplified to:</span> sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
IX/ Giá trị mặc định của một cột
Mặc định sequelize sẽ coi giá trị mặc định là NULL
nhưng ta có thể cấu hình giá trị mặc định:
1 2 3 4 5 6 7 | sequelize<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> defaultValue<span class="token operator">:</span> <span class="token string">"John Doe"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
X/ Các kiểu dữ liệu
Sequelize hỗ trợ nhiều kiểu dữ liệu xài chung lẫn độc quyền cho từng database. Các kiểu dữ liệu độc quyền xem tại đây.
Ngoài ra các kiểu dữ liệu xài chung:
String
1 2 3 4 5 6 7 8 | DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span> <span class="token comment">// VARCHAR(255)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">(</span><span class="token number">1234</span><span class="token punctuation">)</span> <span class="token comment">// VARCHAR(1234)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">.</span><span class="token constant">BINARY</span> <span class="token comment">// VARCHAR BINARY</span> DataTypes<span class="token punctuation">.</span><span class="token constant">TEXT</span> <span class="token comment">// TEXT</span> DataTypes<span class="token punctuation">.</span><span class="token constant">TEXT</span><span class="token punctuation">(</span><span class="token string">'tiny'</span><span class="token punctuation">)</span> <span class="token comment">// TINYTEXT</span> DataTypes<span class="token punctuation">.</span><span class="token constant">CITEXT</span> <span class="token comment">// CITEXT PostgreSQL and SQLite only.</span> DataTypes<span class="token punctuation">.</span><span class="token constant">TSVECTOR</span> <span class="token comment">// TSVECTOR PostgreSQL only.</span> |
Boolean
1 2 | DataTypes<span class="token punctuation">.</span><span class="token constant">BOOLEAN</span> <span class="token comment">// TINYINT(1)</span> |
Numbers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span> <span class="token comment">// INTEGER</span> DataTypes<span class="token punctuation">.</span><span class="token constant">BIGINT</span> <span class="token comment">// BIGINT</span> DataTypes<span class="token punctuation">.</span><span class="token constant">BIGINT</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token comment">// BIGINT(11)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">FLOAT</span> <span class="token comment">// FLOAT</span> DataTypes<span class="token punctuation">.</span><span class="token constant">FLOAT</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token comment">// FLOAT(11)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">FLOAT</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token comment">// FLOAT(11,10)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">REAL</span> <span class="token comment">// REAL PostgreSQL only.</span> DataTypes<span class="token punctuation">.</span><span class="token constant">REAL</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token comment">// REAL(11) PostgreSQL only.</span> DataTypes<span class="token punctuation">.</span><span class="token constant">REAL</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span> <span class="token comment">// REAL(11,12) PostgreSQL only.</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DOUBLE</span> <span class="token comment">// DOUBLE</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token comment">// DOUBLE(11)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token comment">// DOUBLE(11,10)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DECIMAL</span> <span class="token comment">// DECIMAL</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment">// DECIMAL(10,2)</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">.</span><span class="token constant">UNSIGNED</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">.</span><span class="token constant">ZEROFILL</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">.</span><span class="token constant">UNSIGNED</span><span class="token punctuation">.</span><span class="token constant">ZEROFILL</span> <span class="token comment">// You can also specify the size i.e. INTEGER(10) instead of simply INTEGER</span> <span class="token comment">// Same for BIGINT, FLOAT and DOUBLE</span> |
Dates
1 2 3 4 | DataTypes<span class="token punctuation">.</span><span class="token constant">DATE</span> <span class="token comment">// DATETIME for mysql / sqlite, TIMESTAMP WITH TIME ZONE for postgres</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DATE</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token comment">// DATETIME(6) for mysql 5.6.4+. Fractional seconds support with up to 6 digits of precision</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DATEONLY</span> <span class="token comment">// DATE without time</span> |
UUIDs
1 2 3 4 5 | <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">UUID</span><span class="token punctuation">,</span> defaultValue<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">UUIDV4</span> <span class="token comment">// Or DataTypes.UUIDV1</span> <span class="token punctuation">}</span> |
XI/ Các options khác của cột
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <span class="token keyword">const</span> <span class="token punctuation">{</span> Model<span class="token punctuation">,</span> DataTypes<span class="token punctuation">,</span> Deferrable <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"sequelize"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Foo</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> Foo<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// instantiating will automatically set the flag to true if not set</span> flag<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">BOOLEAN</span><span class="token punctuation">,</span> allowNull<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> defaultValue<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// default values for dates => current time</span> myDate<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">DATE</span><span class="token punctuation">,</span> defaultValue<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">NOW</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// setting allowNull to false will add NOT NULL to the column, which means an error will be</span> <span class="token comment">// thrown from the DB when the query is executed if the column is null. If you want to check that a value</span> <span class="token comment">// is not null before querying the DB, look at the validations section below.</span> title<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> allowNull<span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// Creating two objects with the same value will throw an error. The unique property can be either a</span> <span class="token comment">// boolean, or a string. If you provide the same string for multiple columns, they will form a</span> <span class="token comment">// composite unique key.</span> uniqueOne<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> unique<span class="token operator">:</span> <span class="token string">'compositeIndex'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> uniqueTwo<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> unique<span class="token operator">:</span> <span class="token string">'compositeIndex'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// The unique property is simply a shorthand to create a unique constraint.</span> someUnique<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> unique<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// Go on reading for further information about primary keys</span> identifier<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> primaryKey<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// autoIncrement can be used to create auto_incrementing integer columns</span> incrementMe<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> autoIncrement<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// You can specify a custom column name via the 'field' attribute:</span> fieldWithUnderscores<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">STRING</span><span class="token punctuation">,</span> field<span class="token operator">:</span> <span class="token string">'field_with_underscores'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// It is possible to create foreign keys:</span> bar_id<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> references<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// This is a reference to another model</span> model<span class="token operator">:</span> Bar<span class="token punctuation">,</span> <span class="token comment">// This is the column name of the referenced model</span> key<span class="token operator">:</span> <span class="token string">'id'</span><span class="token punctuation">,</span> <span class="token comment">// With PostgreSQL, it is optionally possible to declare when to check the foreign key constraint, passing the Deferrable type.</span> deferrable<span class="token operator">:</span> Deferrable<span class="token punctuation">.</span><span class="token constant">INITIALLY_IMMEDIATE</span> <span class="token comment">// Options:</span> <span class="token comment">// - `Deferrable.INITIALLY_IMMEDIATE` - Immediately check the foreign key constraints</span> <span class="token comment">// - `Deferrable.INITIALLY_DEFERRED` - Defer all foreign key constraint check to the end of a transaction</span> <span class="token comment">// - `Deferrable.NOT` - Don't defer the checks at all (default) - This won't allow you to dynamically change the rule in a transaction</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// Comments can only be added to columns in MySQL, MariaDB, PostgreSQL and MSSQL</span> commentMe<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> DataTypes<span class="token punctuation">.</span><span class="token constant">INTEGER</span><span class="token punctuation">,</span> comment<span class="token operator">:</span> <span class="token string">'This is a column name that has a comment'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> sequelize<span class="token punctuation">,</span> modelName<span class="token operator">:</span> <span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token comment">// Using `unique: true` in an attribute above is exactly the same as creating the index in the model's options:</span> indexes<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span> unique<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> fields<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'someUnique'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |