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