文章内容

2018/3/5 16:31:04,作 者: 黄兵

SQLALCHEMY中的自引用

在关系型数据库中经常出现自引用,但是在SQLALCHEMY如何表示自引用呢?

SQLAlchemy采用adjacency list pattern 来表示类的自引用。

下面看一个例子:

# 材料项目
class MaterialItem(db.Model):
    __tablename__ = 'material_item'
    i_id=db.Column(db.Integer,primary_key=True)
    i_name=db.Column(db.UnicodeText(50))
    i_parent_id=db.Column(db.Integer,db.ForeignKey('i_id'))
    material_brand=db.relationship('MaterialClassificationBrand',backref='MaterialItem')
    i_fk_i=db.relationship('MaterialItem')

这个生成的SQL代码代码如下:

-- ----------------------------
-- Table structure for item
-- ----------------------------
DROP TABLE IF EXISTS `material_item`;
CREATE TABLE `material_item` (
  `i_id` int(12) NOT NULL AUTO_INCREMENT,
  `i_name` varchar(50) DEFAULT NULL,
  `i_parent_id` int(12) DEFAULT NULL,
  PRIMARY KEY (`i_id`),
  KEY `i_fk_i` (`i_parent_id`),
  CONSTRAINT `i_fk_i` FOREIGN KEY (`i_parent_id`) REFERENCES `material_item` (`i_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of material_item
-- ----------------------------
INSERT INTO `material_item` VALUES ('1', '服装/鞋包', null);
INSERT INTO `material_item` VALUES ('2', '男装', '1');
INSERT INTO `material_item` VALUES ('3', '流行男鞋', '1');
INSERT INTO `material_item` VALUES ('4', '女装', '1');
INSERT INTO `material_item` VALUES ('5', '箱包', null);
INSERT INTO `material_item` VALUES ('6', '双肩包', '5');
INSERT INTO `material_item` VALUES ('7', '单肩包', '5');
INSERT INTO `material_item` VALUES ('8', '行李箱', '5');
INSERT INTO `material_item` VALUES ('9', '其他', null);

-- ----------------------------
-- Table structure for product
-- ----------------------------

这样就很好的显示了自引用在SQLAlchemy的写法。


无论自引用是一对多还是多对一,通常默认是一对多。如果想建立多对一的关系,需要在relationship()中添加remote_side属性,remote_side属性包含一列或多列。如:

class Node(Base):
    __tablename__='node'
    id=Column(Integer,primary_key=True)
    parent_id=Column(Integer,ForeignKey('node.id'))
    data=Column(String(50))
    parent=relationship("Node",remote_side=[id])


参考资料:

SQLALCHEMY中的自引用

SQLAlchemy 文档


黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - SQLALCHEMY中的自引用

分享到:

发表评论

评论列表