3. 一对一关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| from typing import Optional
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine
class Card(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) card_id: str = Field(index=True) card_user: str tel: str
detail: Optional["CardDetail"] = Relationship( back_populates="card", sa_relationship_kwargs={"uselist": False}, )
class CardDetail(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) mail: str = Field(index=True) city: str address: str card_id: int | None = Field(default=None, foreign_key="card.id")
card: Optional[Card] = Relationship( back_populates="detail", sa_relationship_kwargs={"uselist": False}, )
def test(): sqlite_file_name = "database.db" sqlite_url = f"sqlite:///{sqlite_file_name}" engine = create_engine(sqlite_url, echo=False) SQLModel.metadata.drop_all(engine) SQLModel.metadata.create_all(engine)
with Session(engine) as session: card1 = Card(card_id="11111111", card_user="Lee", tel="111") card2 = Card(card_id="22222222", card_user="John", tel="222")
card_detail1 = CardDetail( mail="Lee@163.com", city="Shanghai", address="No. 1", card=card1, ) card_detail2 = CardDetail( mail="john@163.com", city="Beijing", address="No. 1", card=card2, ) session.add(card_detail1) session.add(card_detail2) session.commit()
session.refresh(card1) session.refresh(card2) session.refresh(card_detail1) session.refresh(card_detail2)
print("Card1:", card1) print("Card1 detail:", card1.detail) print("Card2:", card2) print("Card2 detail:", card2.detail)
if __name__ == "__main__": test()
|
一对一关系中需要注意设置 sa_relationship_kwargs={"uselist": False},