文章内容
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中的自引用
评论列表