Python SQLAlchemy之多對多

來源:互聯網
上載者:User

標籤:

1.建立三張表host,host_user,host_to_host_user

host:

nid

hostname
1 c1
2 c2
3 c3
4 c4
5 c5

host_user:

nid username
1 root
2 db
3 nb
4 sb

 

host_to_host_user:

nid host_id host_user_id
1 1 1
2 1 2
3 1 3
4 2 2
5 2 4
6 2 3

第一個問題:我們需要查詢c1伺服器裡面的使用者都有哪些?

如果使用傳統的方法,我們使用下面的語句來實現功能:

#取主機名稱為c1的伺服器ID號host_obj = session.query(Host).filter(Host.hostname == ‘c1‘).first()#通過擷取到的伺服器ID號去對應的關係表中找到使用者ID,得到一個列表,裡面是元祖host_2_host_user = session.query(HostToHostUser.host_user_id).filter(HostToHostUser.host_id == host_obj.nid).all()# print (host_2_host_user)   #[(1,), (2,), (3,)]#處理元祖ret = zip(*host_2_host_user)# print (list(ret)[0])users = session.query(HostUser.username).filter(HostUser.nid.in_(list(ret)[0])).all()print (users)
執行結果:
[(‘root‘,), (‘db‘,), (‘nb‘,)]

使用新方式來實現,在建表的步驟裡面我們加入了新的relationship:

#coding:utf-8from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipfrom sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:[email protected]/beadata", max_overflow=5)Base = declarative_base()class Host(Base):    __tablename__ = ‘host‘    nid = Column(Integer,primary_key=True,autoincrement=True)    hostname = Column(String(32))class HostUser(Base):    __tablename__ = ‘host_user‘    nid = Column(Integer,primary_key=True,autoincrement=True)    username = Column(String(32))class HostToHostUser(Base):    __tablename__ = ‘host_to_host_user‘    nid = Column(Integer,primary_key=True,autoincrement=True)    host_id = Column(Integer,ForeignKey(‘host.nid‘))    host_user_id = Column(Integer,ForeignKey(‘host_user.nid‘))    host = relationship(‘Host‘,backref = ‘h‘)    host_user = relationship(‘HostUser‘,backref = ‘u‘)Session = sessionmaker(bind=engine)session = Session()# session.add_all([#     Host(hostname=‘c1‘),#     Host(hostname=‘c2‘),#     Host(hostname=‘c3‘),#     Host(hostname=‘c4‘),#     Host(hostname=‘c5‘),# ])## session.add_all([#     HostUser(username=‘root‘),#     HostUser(username=‘db‘),#     HostUser(username=‘nb‘),#     HostUser(username=‘sb‘),# ])## session.add_all([#     HostToHostUser(host_id=‘1‘,host_user_id=‘1‘),#     HostToHostUser(host_id=‘1‘,host_user_id=‘2‘),#     HostToHostUser(host_id=‘1‘,host_user_id=‘3‘),#     HostToHostUser(host_id=‘2‘,host_user_id=‘2‘),#     HostToHostUser(host_id=‘2‘,host_user_id=‘4‘),#     HostToHostUser(host_id=‘2‘,host_user_id=‘3‘),# ])host_obj = session.query(Host).filter(Host.hostname == ‘c1‘).first()print (host_obj.nid)print (host_obj.hostname)print (host_obj.h)
執行結果:
1c1[<__main__.HostToHostUser object at 0x0000000003FA3208>, <__main__.HostToHostUser object at 0x0000000003FA3278>, <__main__.HostToHostUser object at 0x0000000003FA32E8>]

host_obj.h擷取到三個對象,然後迴圈這三個對象,可以得到這三個對象中的host_to_host_user表中的host_user.nid,host_user.host_id,host_user.host_user_id:

for item in host_obj.h:    print (item.host_user,item.host_user.username)

執行結果:
1c1[<__main__.HostToHostUser object at 0x0000000003FA2208>, <__main__.HostToHostUser object at 0x0000000003FA2278>, <__main__.HostToHostUser object at 0x0000000003FA22E8>]<__main__.HostUser object at 0x0000000003FA28D0> root<__main__.HostUser object at 0x0000000003FA2A90> db<__main__.HostUser object at 0x0000000003FA2C50> nb

 

Python SQLAlchemy之多對多

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.