如何使用 sequelize 和 mysql 创建一对一的关系?

Posted

技术标签:

【中文标题】如何使用 sequelize 和 mysql 创建一对一的关系?【英文标题】:How to create a one-to-one relationship using sequelize and mysql? 【发布时间】:2019-02-11 09:52:44 【问题描述】:

我正在尝试在两个实体之间创建一对一的关系。我使用sequelize 作为数据库mysql 的ORM。

我的模型定义如下:

var user = (sequelize, DataTypes) =>                                                                                
  const User = sequelize.define('user',                                                                             
    name: type: DataTypes.STRING, allowNull: false, unique: true                                                   
  ,                                                                                                                
    timestamps: false                                                                                                
  );                                                                                                                

  return User;                                                                                                       
;                                                                                                                   

var product = (sequelize, DataTypes) =>                                                                             
  const Product = sequelize.define('product',                                                                       
    title: type: DataTypes.STRING, allowNull: false, unique: true, default: 'Coop Default'                         
  ,                                                                                                                
    timestamps: false                                                                                                
  );                                                                                                                

  return Product;                                                                                                    
;                                                                                                                   

并通过以下代码行建立一对一的关系

db.product.belongsTo(db.user);                                                                                       
db.user.hasOne(db.product);  

但是,这不会在表 products 中创建唯一的外键。

mysql> desc products;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| title  | varchar(255) | NO   | UNI | NULL    |                |
| userId | int(11)      | YES  | MUL | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我还应该在 ORM 中做些什么来确保 userId 是唯一的?

【问题讨论】:

请检查以下答案 - ***.com/questions/29551941/… 【参考方案1】:

我可以通过在模型定义中提及它来强制对foreignKey 施加unique 约束,显然,sequelize 无法从关联中做到这一点。

var product = (sequelize, DataTypes) =>                                                                             
  const Product = sequelize.define('product',                                                                       
    title:  type: DataTypes.STRING,                                                                                 
             allowNull: false,                                                                                       
             unique: true                                                                                            
           ,                                                                                                        

    userId:  type: DataTypes.INTEGER,                                                                                  
           allowNull: false,                                                                                         
           unique: true                                                                                              
                                                                                                                    
  ,                                                                                                                
    timestamps: false                                                                                                
  );                                                                                                                

  return Product;                                                                                                    
;                                                                                                                   

【讨论】:

以上是关于如何使用 sequelize 和 mysql 创建一对一的关系?的主要内容,如果未能解决你的问题,请参考以下文章

Node、Sequelize、Mysql - 如何为模型定义排序规则和字符集?

如何在 Sequelize 中使用 MySQL JSON 数据类型

如何在 mysql Sequelize 实例中拥有数组的数据类型?

如何在 MySql 中使用 sequelize 运行多个原始查询?

如何将 sequelize.sync 选项强制设置为 false?

如何在 sequelize 标准 createdAt 字段中使用毫秒?