sqlalchemy 链表操作---->多对多

简介:

多对多表结构创建


from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index

from sqlalchemy.orm import sessionmaker, relationship


engine = create_engine("mysql+pymysql://root:root@192.168.100.201:3306/web", max_overflow=5)

Base = declarative_base(engine)

Session = sessionmaker(bind=engine)

dbSession = Session()


# 多对多

class HostToHostUser(Base):

    __tablename__ = 'host_to_hostuser'

    nid = Column(Integer, primary_key=True, autoincrement=True)

    host_id = Column(Integer, ForeignKey('host.nid'))

    hostuser_id = Column(Integer, ForeignKey('hostuser.nid'))


    # 多对多操作

    host = relationship('Host', backref='h')

    hostuser = relationship('HostUser', backref='hu')


class Host(Base):

    __tablename__ = 'host'

    nid = Column(Integer, primary_key=True, autoincrement=True)


    hostname = Column(String(32))

    port = Column(String(32))

    ip = Column(String(32))


   #创建到关联表的虚拟关系 

    ###############################################

    host_user = relationship('HostUser', secondary=HostToHostUser.__table__, backref='h')


class HostUser(Base):

    __tablename__ = 'hostuser'

    nid = Column(Integer, primary_key=True, autoincrement=True)

    username = Column(String(32))



def init_db():

    Base.metadata.create_all(engine)


def drop_db():

    Base.metadata.drop_all(engine)


向表内插入数据

# ##################################################################

# dbSession.add_all([

#     Host(hostname='lala1', port='22', ip='1.1.1.1'),

#     Host(hostname='lala2', port='22', ip='1.1.1.2'),

#     Host(hostname='lala3', port='22', ip='1.1.1.3'),

#     HostToHostUser(host_id=1, hostuser_id=1),

#     HostToHostUser(host_id=1, hostuser_id=2),

#     HostToHostUser(host_id=1, hostuser_id=3),


# ])

# dbSession.commit()

##################################################################

查询数据

# 首先查询hostname 为 lala1 的 host

host_obj = dbSession.query(Host).filter(Host.hostname=='lala1').first()

print host_obj

# 通过反向查询,查到hostuser 的对象

for item in host_obj.h:

    print (item.hostuser.username)


最后总结:

多对多表结构,只需在主表上创建到子表的虚拟关系:

host_user = relationship('HostUser', secondary=HostToHostUser.__table__, backref='h')

然后在中间表中,关联两张表的外键,再通过relationship + backref参数创建虚拟关系,实现正反向查询

本文转自   tianshuai369   51CTO博客,原文链接:http://blog.51cto.com/songqinglong/1956840


相关文章
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
102 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
132 2
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
169 1
[leetcode 链表] 反转链表 vs 链表相交
[leetcode 链表] 反转链表 vs 链表相交
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II