sqlalchemy 基本查询

本文通过一系列示例展示了如何使用Python的SQLAlchemy ORM进行数据库操作,包括增删改查、过滤条件设置、聚合函数使用等常见操作。
部署运行你感兴趣的模型镜像
from sqlalchemy import func, or_, not_


user = User(name='a')
session.add(user)
user = User(name='b')
session.add(user)
user = User(name='a')
session.add(user)
user = User()
session.add(user)
session.commit()

query = session.query(User)
print query # 显示SQL 语句
print query.statement # 同上
for user in query: # 遍历时查询
    print user.name
print query.all() # 返回的是一个类似列表的对象
print query.first().name # 记录不存在时,first() 会返回 None
# print query.one().name # 不存在,或有多行记录时会抛出异常
print query.filter(User.id == 2).first().name
print query.get(2).name # 以主键获取,等效于上句
print query.filter('id = 2').first().name # 支持字符串

query2 = session.query(User.name)
print query2.all() # 每行是个元组
print query2.limit(1).all() # 最多返回 1 条记录
print query2.offset(1).all() # 从第 2 条记录开始返回
print query2.order_by(User.name).all()
print query2.order_by('name').all()
print query2.order_by(User.name.desc()).all()
print query2.order_by('name desc').all()
print session.query(User.id).order_by(User.name.desc(), User.id).all()

print query2.filter(User.id == 1).scalar() # 如果有记录,返回第一条记录的第一个元素
print session.query('id').select_from(User).filter('id = 1').scalar()
print query2.filter(User.id > 1, User.name != 'a').scalar() # and
query3 = query2.filter(User.id > 1) # 多次拼接的 filter 也是 and
query3 = query3.filter(User.name != 'a')
print query3.scalar()
print query2.filter(or_(User.id == 1, User.id == 2)).all() # or
print query2.filter(User.id.in_((1, 2))).all() # in

query4 = session.query(User.id)
print query4.filter(User.name == None).scalar()
print query4.filter('name is null').scalar()
print query4.filter(not_(User.name == None)).all() # not
print query4.filter(User.name != None).all()

print query4.count()
print session.query(func.count('*')).select_from(User).scalar()
print session.query(func.count('1')).select_from(User).scalar()
print session.query(func.count(User.id)).scalar()
print session.query(func.count('*')).filter(User.id > 0).scalar() # filter() 中包含 User,因此不需要指定表
print session.query(func.count('*')).filter(User.name == 'a').limit(1).scalar() == 1 # 可以用 limit() 限制 count() 的返回数
print session.query(func.sum(User.id)).scalar()
print session.query(func.now()).scalar() # func 后可以跟任意函数名,只要该数据库支持
print session.query(func.current_timestamp()).scalar()
print session.query(func.md5(User.name)).filter(User.id == 1).scalar()

query.filter(User.id == 1).update({User.name: 'c'})
user = query.get(1)
print user.name

user.name = 'd'
session.flush() # 写数据库,但并不提交
print query.get(1).name

session.delete(user)
session.flush()
print query.get(1)

session.rollback()
print query.get(1).name
query.filter(User.id == 1).delete()
session.commit()
print query.get(1)

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 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 执行外键查询,包括正向查询、反向查询以及涉及排序和删除策略的应用场景。合理设计模型间的关系能够极大简化复杂业务逻辑下的数据库交互过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值