
官方文档
class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) email_address = Column(String, nullable=False) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User", back_populates="addresses") def __repr__(self): return "<Address(email_address='%s')>" % elf.email_address 这里 ForeignKey('users.id') 是必须的么? 可以不使用外键强制约束吗?
1 linnchord 2017 年 10 月 6 日 可以啊,自己写程序实现关联呗。 |
2 Tyanboot PRO 当然可以啦, 比如说你有一个 users 表: class User(Base): __tablename__ = "users" id_ = Column(Integer, primary_key=True) name = Column(String(16)) 你还有一个 address 表: class Address(Base): __tablename__ = "address" id_ = Column(Integer, primary_key=True) place = Column(String(256)) user_id = Column(Integer) user = relationship("User", uselist=False, primaryjoin=foreign(user_id) == remote(User.id_)) 你只需要在 relationship 里用 primaryjoin 来手动指定 join 关系就可以了, 前提是已经导入了 User. 这部分也在文档里提到了 此外还可以写成 relationship("User", uselist=False, foreign_keys=user_id, primaryjoin="Address.user_id==User.id_") 这种写法同样要求已经导入 User, 但是会被 ide 识别为 unused import. 所以建议使用第一种 |
3 cevincheung OP @Tyanboot #2 user = relationship("User", uselist=False, primaryjoin=foreign(user_id) == remote(User.id_)) 这不还是有 foreign 么 |
4 Tyanboot PRO @cevincheung …首先你是不是被降权了,没收到通知 其次虽然这里有 foreign,但实际上在数据库里面是不会有外键约束的。这里只是把这个 user_id 看作了外键,以便于进行 join 查询,和他本身是不是外键是没关系的。 |
5 cevincheung OP |
6 cevincheung OP @Tyanboot #4 好吧,在 sqlalchemy.orm 中 |