SQLAlchemy的使用---外键ForeignKey数据增删改查

本文介绍了Python ORM库SQLAlchemy中如何使用外键ForeignKey进行数据的增删改查操作,详细解析了相关步骤和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 添加数据
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine, Student, School

Session = sessionmaker(engine)
db_session = Session()

# 插入数据
sch_obj = School(name='Treasure')
db_session.add(sch_obj)
db_session.commit()


sch = db_session.query(School).filter(School.name == 'Treasure').first()
stu_obj = Student(name=
### SQLAlchemy 查询示例 在 SQLAlchemy 中,查询可以通过定义模型之间的关系(`relationship`),并利用这些关系来进行数据访问。以下是关于如何使用 SQLAlchemy 进行查询的具体说明。 #### 定义模型及其关系 为了演示查询,我们先定义两个表 `User` 和 `Article`,其中 `Article` 表中的 `uid` 字段作为指向 `User` 表的主 `id`。 ```python from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Text from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), nullable=False) # 建立与 Article 的关系 articles = relationship('Article', back_populates='author') class Article(Base): __tablename__ = 'article' id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(50), nullable=False) content = Column(Text, nullable=False) # 定义字段 uid = Column(Integer, ForeignKey("user.id")) # 建立与 User 的关系 author = relationship('User', back_populates='articles') ``` 上述代码中,`User.articles` 是一种正向查询方式,而 `Article.author` 则是一种反向查询方式[^3]。 --- #### 正向查询 正向查询是指从父表到子表的查询。例如,给定一个用户对象,可以轻松获取该用户的全部文章列表: ```python # 创建会话 engine = create_engine('sqlite:///:memory:') Session = sessionmaker(bind=engine) session = Session() Base.metadata.create_all(engine) # 添加测试数据 user1 = User(username="Alice") article1 = Article(title="First Post", content="This is my first post.", uid=user1.id) article2 = Article(title="Second Post", content="Another great post!", uid=user1.id) user1.articles.append(article1) user1.articles.append(article2) session.add(user1) session.commit() # 查询 Alice 发布的所有文章 alice_articles = session.query(User).filter_by(username="Alice").first().articles for article in alice_articles: print(f"Title: {article.title}, Content: {article.content}") ``` 此部分展示了如何通过 `User.articles` 属性进行正向查询。 --- #### 反向查询 反向查询是从子表到父表的查询。例如,给定一篇文章对象,可以直接找到其作者的信息: ```python # 获取某篇文章的对象 specific_article = session.query(Article).filter_by(id=1).first() # 查找这篇文章的作者 if specific_article and specific_article.author: print(f"Author of the article '{specific_article.title}': {specific_article.author.username}") else: print("No such article or no associated user.") ``` 这里通过 `Article.author` 实现了反向查询的功能。 --- #### 删除选项的影响 在定义时,还可以设置删除行为(如级联删除)。这通常通过 `ondelete` 参数完成。例如,在定义时加入以下参数可实现当父记录被删除时自动删除所有相关子记录: ```python uid = Column(Integer, ForeignKey("user.id", ondelete="CASCADE")) ``` 这样配置后,如果某个用户被删除,则与其关联的文章也会一并删除[^2]。 --- #### 排序查询 除了基本的查询之,还可以对关联的数据进行排序操作。例如按时间顺序排列某一用户发布的所有文章: ```python sorted_articles = ( session.query(Article) .join(Article.author) # 加入关联条件 .filter(User.username == "Alice") # 筛选特定用户的文章 .order_by(Article.id.asc()) # 升序排序 .all() ) for art in sorted_articles: print(f"{art.title}: {art.content[:50]}...") ``` 此处展示了一个基于连接和排序的操作方法[^4]。 --- ### 总结 以上介绍了如何使用 SQLAlchemy 执行查询,包括正向查询、反向查询以及涉及排序和删除策略的应用场景。合理设计模型间的关系能够极大简化复杂业务逻辑下的数据库交互过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值