2016-08-11 63 views
0

我需要定義我的表作爲如何使用sequelize ORM

CREATE TABLE `test` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `o_id` int(11) unsigned NOT NULL, 
    `m_name` varchar(45) NOT NULL, 
    `o_name` varchar(45) NOT NULL, 
    `customer_id` int(11) unsigned NOT NULL, 
    `client_id` tinyint(4) unsigned DEFAULT '1', 
    `set_id` tinyint(4) unsigned DEFAULT NULL, 
    `s1` tinyint(4) unsigned DEFAULT NULL, 
    `s2` tinyint(4) unsigned DEFAULT NULL, 
    `s3` tinyint(4) unsigned DEFAULT NULL, 
    `review` varchar(2045) DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `br_o_id_idx` (`order_id`), 
    KEY `br_date_idx` (`created_at`), 
    KEY `br_on_idx` (`operator_name`), 
    KEY `br_mn_idx` (`merchant_name`) 
) 

但我期待在sequelize文檔,它不具備與小int的支持(4)我列定義爲TINYINT其尺寸。

回答

0

由於您的表格定義中缺少ZERO_FILL,我懷疑tinyint(4)可能不會執行您認爲的操作。 From 11.2.5 Numeric Type Attributes

MySQL支持一個擴展,用於在該類型的base關鍵字後面的括號內指定整型數據類型的顯示寬度。

...

顯示寬度不限制可以存儲在列中的值的範圍內。

...

例如,指定爲SMALLINT柱(3)具有-32768到32767的通常SMALLINT範圍內,並且由三個數字允許的範圍之外的值被使用多於三個顯示在全數字。

我不知道是否有其他的RDBMS對待括號的數量不同,但細讀sequelize source看起來他們是在相同的,不正確的印象你。

這就是說,你的模式的重要部分,因爲你想存儲這些字段爲TINYINT s(只使用一個字節的存儲空間來包含0-255之間的值),在Sequelize數據類型。我可能會建議打開PR,將其添加...

在另一方面,如果你真的正在尋找ZEROFILL功能,並需要指定的4 顯示寬度,你可以做類似Sequelize.INTEGER(4).ZEROFILL,但顯然,這將會浪費數據庫中的空間。

+0

所以它如何真正重要。我只想限制我的值在0-255之間,因爲我的數據庫中有一列是tinyint。不管天氣我是用0填充還是不填 –

+0

這就是我的觀點;整數類型*後的括號中的數字不會這樣做。既然'sequelize'作者沒有提供正確的方法去做你想做的事,你不能這麼做。你可以嘗試使用[sequelize boolean](https://github.com/sequelize/sequelize/blob/master/lib/data-types.js#L377)類型在模式中創建一個'tinyint'字段,但是我想象一下,這會對ORM處理JS類型的方式造成嚴重破壞。 – Will

+0

實際上,考慮'sequelize'如何處理這個問題,如果你說你在sequelize之外創建模式,所以它已經是tinyint了,你可以使用'min'和'max' [驗證](http ://文檔。sequelizejs.com/en/latest/docs/models-definition/#validations)來得到你想要的,並告訴sequelize它是一個整數字段。 – Will

2

對於MySQL,Sequelize.BOOLEAN數據類型映射到TINYINT(1)。見

https://github.com/sequelize/sequelize/blob/3e5b8772ef75169685fc96024366bca9958fee63/lib/data-types.js#L397

http://docs.sequelizejs.com/en/v3/api/datatypes/

正如@ user866762,括號中的數字隻影響數據是如何顯示的,它不是如何存儲注意。因此,TINYINT(1)與TINYINT(4)應該不會影響您的數據。

+0

對不起,剛纔意識到你有'tinyint unsigned',我不相信你可以將UNSIGNED標誌添加到Sequelize.BOOLEAN類型。如果你真的需要128到255之間的值,你可能會被迫使用Sequelize.INTEGER ...你總是可以用'tinyint unsigned'字段創建表格,並在模型中使用Sequelize.INTEGER類型以及驗證來確保值保持在0到255之間。但是,您不能將模型同步到數據庫。 –

+0

我不需要BOOLEAN類型 –

+0

我知道你不需要BOOLEAN類型。如果你看看我鏈接的文檔和代碼,你會發現Sequelize將BOOLEAN翻譯爲MySQL的TINYINT。這是通過Sequelize有效使用TINYINT的唯一方法。正如我之前所述,您只有其他選擇是使用INTEGER和驗證。 –