sqlalchemy表关系之多对多

发布时间:2018-06-04 编辑:admin 阅读:

sqlalchemy表之间的关系有三种:1、多对多  2、一对多  3、一对一
下面就讲讲sqlalchemy表之间如何建立多对多关系。 
首先,我们把两个需要做多对多关系的模型定义出来,这里以Arctire,Tag模型为例(示例代码如下)
class Arctire(Base): 
     __tablename__ = "arctire"  
  id = Column(Integer , primary_key=True , autoincrement=True)  
  name = Column(String(50) , nullable=False)  
  tags = relationship("Tag", backref="arctires", secondary=arctire_tag)
  
def __repr__(self):
  return "name:%s"%self.name
  
class Tag(Base):  
   __tablename__ = "tag"  
  id = Column(Integer , primary_key=True , autoincrement=True)  
  tag = Column(String(50) , nullable=False)
  
def __repr__(self):
  return "tag:%s"%self.tag
 
表多对多关系需要定义一张中间表来绑定它们之间的关系。我们通过Table来定义一张中间表(Table需从sqlalchemy中导入)

arctire_tag = Table(
"arctire_tag"       #表名
Base.metadata   #表继承的类
Column(“arctire_id” , Integer , primary_key=True , ForeignKey("arctire.id")      #arctire_id 为字段名
Column("tag_id" , Integer , primary_key=True , ForeignKey("tag.id")   
)

用Table定义好中间表后,我们在两个模型中随便选择一个模型定义relationship属性(在这里,我们以Arctire模型为例,你也可以选择在Tag模型定义),并传入 seconday = "中间表对象”(代码如下所示,红色文字为我们添加的)

class Arctire(Base):  
__tablename__ = "arctire" 
id = Column(Integer , primary_key=True , autoincrement=True)  
name = Column(String(50) , nullable=False)  
tags = relationship("Tag", backref="arctires", secondary=arctire_tag)

最后一步,点击运行。运行无误,然后在mysql命令行工具输入 show create tabel arctire_tag ,如下图所示
sqlalchemy表关系之多对多

代码详解:

PRIMARY KEY("user_id","tag_id")    #user_id,tag_id 字段被封装成复合主键
CONSTRAINT "arctire_tag_ibfk_1" FOREIGN KEY ("user_id”) REFERENCES "arctire” ('id")     #  表示user_id 这个字段引用自arctire表中的id字段
CONSTRAINT "arctire_tag_ibfk_2" FOREIGN KEY ("tag_id”) REFERENCES "tag” ('id")     #  表示tag_id 这个字段引用自tag表中的id字段
出现上方信息,表明表多对多关系创建成功。下面我们添加数据测试一下

arctire1 = Arctire(name = "arctire1")
arctire2 = Arctire(name = "arctire2")

tag1 = Tag(tag = "tag1")
tag2 = Tag(tag = "tag2")

arctire1.tags.append(tag1)
arctire1.tags.append(tag2)

arctire2.tags.append(tag1)
arctire2.tags.append(tag2)

session.add(arctire1)
session.add(arctire2)
session.commit()

然后在命令行工具分别查询arctire,tag,arctire_tag表中的数据
1、select * from arcitre;


2、select * from tag;


3、select * from arctire_tag; (注: user_id1 表示arctire1 ,tag_id 表示tag1......以此类推)


通过上图我们可以发现,数据成功添加入到表中,然后我们从表中查询一下,以此来验证两张表是否成功建立多对多关系。

1、从arctire表中查询所有的标签
arctire = session.query(Arctire).first()
print(arctire.tags)

运行结果如下所示:


2、反之,我们也可以从标签表中查询到标签所被引用的所有文章。


完整代码,点击下载





 

 

关注我

图文推荐

云标签

友链交换