为了账号安全,请及时绑定邮箱和手机立即绑定

SQLAlchemy 中关系定义的几个问题( 一对一 / 多对多 )

SQLAlchemy 中关系定义的几个问题( 一对一 / 多对多 )

有只小跳蛙 2019-02-24 06:58:08
2016/11/11 问题 官网关于这一部分的讲解, 不是很详细, 尤其是拿 Parent 和 Child 作为比喻, 感觉不是很形象, 我基于自己的理解,写了对应的的 demo, 但是不是很清楚: 是否符合最佳实践 是否漏掉了某些最佳实践? 我看书, 了解到, 实际生产中, 虽然外键可以降低开发成本, 但是许多情况下不推荐外键来关联, 另有其他方法, 不知这句话的内涵是什么? 相关代码 多对多 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from sqlalchemy import (Table, Column, Integer, String, Numeric, DateTime) from sqlalchemy.orm import relationship from sqlalchemy import ForeignKey engine = create_engine('sqlite:///:memory:') Base = declarative_base() Session = sessionmaker(bind=engine) session = Session() class Many1(Base): __tablename__ = 'many1' id = Column(Integer, primary_key=True, autoincrement=True) attr1 = Column(String, nullable=False) many2 = relationship('Many2', back_populates='many1', secondary=many1_many2_table) # 1?? 定义正确? class Many2(Base): __tablename__ = 'many2' id = Column(Integer, primary_key=True, autoincrement=True) attr2 = Column(String, nullable=False) many1 = relationship('Many1', back_populates='many2', secondary=many1_many2_table) # 2?? 定义正确? many1_many2_table = Table('many1_many2', Base.metadata, Column('many1_id', Integer, ForeignKey('many1.id')), Column('many2_id', Integer, ForeignKey('many2.id'))) 1. 查询 m1 身上所有的 Many2 ( m1 是 Many1 的实例 ) a. return m1.many2 这种能写吗, 其实这种很直观! Elixir中能够这样写 b. session.query(Many2).filter(Many2.many1 == m1).all() 2. 定义多对多, 需要额外定义一张关联表, 难道没有一劳永逸的办法吗? ( 生产数据库中可不止几张关系表, 都要手写? ) 一对一 class One1(Base): __tablename__ = 'one1' id = Column(Integer, primary_key=True, autoincrement=True) attr1 = Column(String, nullable=False) one2 = relationship('One2', back_populates='one1', uselist=False) # 1?? 看官网文档, 只需要添加 uselist 这个参数即可 class One2(Base): __tablename__ = 'one2' id = Column(Integer, primary_key=True, autoincrement=True) attr2 = Column(String, nullable=False) one1_id = Column(Integer, ForeignKey('one1.id'))
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 540 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信