sqlalchemy表關(guān)聯(lián)查詢

一. 一對多, 一對一,多對多

參考文檔: https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#many-to-many 或者=>
https://www.cnblogs.com/jasonwang-2016/p/5980237.html

1. 一對多

一對多使用的很多了,略
一對一只需要在一對多關(guān)系基礎(chǔ)上使用uselist=False參數(shù)

2. 多對多

參考文檔: https://www.cnblogs.com/wuheng-123/p/9706047.html

域名解析為負載均衡器與主機多對多的關(guān)系:

...

DnsRecord_HostIp = Table(
  'dnsrecord_hostip',
  Base.metadata,
  Column('dns_record_id',Integer, ForeignKey('dns_record.id'), primary_key=True),
  Column('host_ip_id',String(32), ForeignKey('host_ip.ID'), primary_key=True),
  #兩字段primary_key都等于True,組合主鍵唯一,防止內(nèi)容一樣
)

class Host_Ip(Base):
  __tablename__ = 'host_ip'
  ID = Column(String(32),nullable=False, unique=True, primary_key=True)
  name = Column(String(32))
  ipv4_external = Column(String(20), index=True)
  ipv4_internal = Column(String(20), nullable=False)
  vpc_id = Column(String(32), ForeignKey('vpc.ID'), nullable=False)
  vpc = relationship(Vpc, backref='host_ip')

class Dns_Record(Base):
  __tablename__ = 'dns_record'
  id = Column(Integer, primary_key=True, autoincrement=True)
  domain_id = Column(Integer, ForeignKey('domain.id'), nullable=False)
  domain = relationship(Domain, backref='dns_record')
  project_name = Column(String(25), server_default='默認項目')
  type = Column(String(6), nullable=False)
  value = Column(String(32), nullable=False)
  TTL = Column(SmallInteger, server_default='600', nullable=False)
  # 以下也可在程序中運行得到
  loadbalancer_id = Column(String(32), ForeignKey('loadbalancer.ID'))
  loadbalancer = relationship(Loadbalancer, backref='dns_record')
  host_ip_id = Column(String(32), ForeignKey('host_ip.ID'))
  host_ip = relationship(Host_Ip, backref='dns_record')
  # 多對多關(guān)聯(lián)關(guān)系,注意此處與上面host_ip的不同
  host_ip2 = relationship(Host_Ip, backref='dns_record2',secondary='dnsrecord_hostip')  # secondary,中間表

注意:host_ip是一對多關(guān)聯(lián)關(guān)系,而hpst_ip2是多對多的關(guān)聯(lián)關(guān)系
host_ip2的關(guān)聯(lián)關(guān)系表示,當解析到負載均衡器時,負載均衡器綁定的后端主機關(guān)聯(lián)關(guān)系

多對多.png

二. sqlalchemy之分組查詢

參考文檔: http://m.itdecent.cn/p/0bab8f7cfdfd

查詢dns解析記錄表中解析多余1條的記錄:
SQL語法:
select domain_id,count(*) from dns_record group by domain_id HAVING count(*)>1
sqlalchemy中如下:

from sqlalchemy import func

......
  # 分組查詢測試
  def tt(self):
    #group_list = self.session.query(Dns_Record.domain_id, func.count(Dns_Record.domain_id)).group_by(Dns_Record.domain_id).all() 

    nums = func.count('*').label('c')    #顯示名'c'
    group_list = self.session.query(Dns_Record.domain_id, nums).group_by(Dns_Record.domain_id).having(nums>1).all() 
    for v in group_list:
      print(v.domain_id, v.c)       #是v.c,不是v.nums

輸出結(jié)果:

207 2
223 2
225 2
227 2
229 2
253 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容