【Python百日进阶-Web开发-Peewee】Day268 - Peewee API文档 - 查询生成器(四)

11.2.27 class Query

class Query([where=None[, order_by=None[, limit=None[, offset=None[, **kwargs]]]]])

参数:

  • where – WHERE 子句的表示。
  • order_by (tuple) – 要排序的列或值。
  • limit (int) – LIMIT 子句的值。
  • offset (int) – OFFSET 子句的值。
    支持方法链 API 的查询的基类。

with_cte(*cte_list)

参数: cte_list – 零个或多个 CTE 对象。
在查询中包含给定的公用表表达式。任何先前指定的 CTE 都将被覆盖。有关公用表表达式的示例,请参阅公用表表达式。

where(*expressions)

参数: 表达式——包含在 WHERE 子句中的零个或多个表达式。
在查询的 WHERE 子句中包含给定的表达式。这些表达式将与任何先前指定的 WHERE 表达式一起进行 AND 运算。

用户名等于“某人”的示例选择用户:

sq = User.select().where(User.username == 'somebody')

选择由编辑或管理员用户发布的推文的示例:

sq = Tweet.select().join(User).where(
(User.is_editor == True) |
(User.is_admin == True))

删除不再活跃用户推文的示例:

inactive_users = User.select().where(User.active == False)
dq = (Tweet
.delete()
.where(Tweet.user.in_(inactive_users)))
dq.execute() # 返回已删除推文的数量。

笔记
where() 调用是可链接的。多个调用将被“AND”在一起。

orwhere(*expressions)

参数: 表达式——包含在 WHERE 子句中的零个或多个表达式。
在查询的 WHERE 子句中包含给定的表达式。此方法与 Query.where() 方法相同,不同之处在于表达式将与任何先前指定的 WHERE 表达式一起进行 OR-ed。

order_by(*values)

参数: values - 零个或多个要排序的列状对象。
定义 ORDER BY 子句。任何先前指定的值都将被覆盖。

order_by_extend(*values)

参数: values - 零个或多个要排序的类似列的对象。
使用给定值扩展任何先前指定的 ORDER BY 子句。

limit([value=None])

参数: value (int) – 为 LIMIT 子句指定值。

offset([value=None])

参数: value (int) – 指定 OFFSET 子句的值。

paginate(page[, paginate_by=20])

参数:
page (int) – 结果的页码(从 1 开始)。
paginate_by (int) – 每页行数。
以更直观的方式指定 LIMIT 和 OFFSET 的便捷方法。

此功能在设计时考虑了网站分页,因此第一页以 page=1 开头。

11.2.28 class SelectBase

class SelectBase

Select和CompoundSelect查询的基类。

peek(database[, n=1])

参数:
database ( Database ) – 执行查询的数据库。
n ( int ) – 要返回的行数。
回报:
如果 n = 1,则为单行,否则为行列表。

执行查询并从游标开始返回给定的行数。该函数可以安全地多次调用,并且总是返回前 N 行结果。

first(database[, n=1])

参数:
数据库( Database ) – 执行查询的数据库。
n ( int ) – 要返回的行数。
回报:
如果 n = 1,则为单行,否则为行列表。

与该peek()方法一样,除了将 aLIMIT应用于查询以确保仅n返回行。多次调用相同的值n不会导致多次执行。

scalar(database[, as_tuple=False])

参数:
数据库( Database ) – 执行查询的数据库。
as_tuple ( bool ) – 将结果作为元组返回?
回报:
单个标量值 if ,否则为行元组。as_tuple = False

从结果的第一行返回一个标量值。如果预期有多个标量值(例如,单个查询中的多个聚合),那么您可以指定as_tuple=True获取行元组。

例子:

query = Note.select(fn.MAX(Note.timestamp))
max_ts = query.scalar(db)

query = Note.select(fn.MAX(Note.timestamp), fn.COUNT(Note.id))
max_ts, n_notes = query.scalar(db, as_tuple=True)

count(database[, clear_limit=False])

参数:
数据库( Database ) – 执行查询的数据库。
clear_limit ( bool ) – 计数时清除任何 LIMIT 子句。
回报:
查询结果集中的行数。

返回查询结果集中的行数。

通过运行 SELECT COUNT(1) FROM () 实现。

exists(database)

参数: 数据库( Database ) – 执行查询的数据库。
回报: 当前查询是否存在任何结果。
返回一个布尔值,指示当前查询是否有任何结果。

get(database)

参数: 数据库( Database ) – 执行查询的数据库。
回报: 来自数据库的单行或None.
执行查询并返回第一行(如果存在)。多次调用将导致执行多个查询。

11.2.29 class CompoundSelectQuery

class CompoundSelectQuery(lhs, op, rhs)

参数:

  • lhs ( SelectBase ) – Select 或 CompoundSelect 查询。
  • op ( str ) – 操作(例如 UNION、INTERSECT、EXCEPT)。
  • rhs ( SelectBase ) – Select 或 CompoundSelect 查询。
    表示复合 SELECT 查询的类。

11.2.30 class Select

class Select([from_list=None[, columns=None[, group_by=None[, having=None[, distinct=None[, windows=None[, for_update=None[, for_update_of=None[, for_update_nowait=None[, **kwargs]]]]]]]]]])

参数:

  • from_list ( list ) – FROM 子句的来源列表。
  • columns ( list ) – 要选择的列或值。
  • group_by ( list ) – 要分组的列或值的列表。
  • have ( Expression ) – HAVING 子句的表达式。
  • distinct – 布尔值或列状对象列表。
  • windows ( list ) --Window子句列表。
  • for_update – 布尔值或 str 指示是否 SELECT…FOR UPDATE。
  • for_update_of – FOR UPDATE OF 子句的一个或多个表。
  • for_update_nowait ( bool ) – 指定现在锁定。
    表示 SELECT 查询的类。

笔记

而不是直接实例化它,最常见的是您将使用工厂方法,如Table.select()or Model.select()。

选择查询上的方法可以链接在一起。

从数据库中选择一些用户实例的示例。仅选择id 和username列。迭代时,将返回User模型的实例:

query = User.select(User.id, User.username)
for user in query:
    print(user.username)

示例选择用户以及用户发布的推文数量。返回的User实例将有一个附加属性“count”,它对应于推文的数量:

query = (User
         .select(User, fn.COUNT(Tweet.id).alias('count'))
         .join(Tweet, JOIN.LEFT_OUTER)
         .group_by(User))
for user in query:
    print(user.username, 'has tweeted', user.count, 'times')

笔记

虽然可以Select直接实例化,但更常见的是使用方法链 API 构建查询。

columns(*columns)

参数: 列– 选择零个或多个类似列的对象。
指定要选择的列或类似列的值。

select(*columns)

参数: 列– 选择零个或多个类似列的对象。
与 相同Select.columns(),提供向后兼容性。

select_extend(*columns)

参数: 列– 选择零个或多个类似列的对象。
使用给定的列扩展当前选择。

例子:

def get_users(with_count=False):
    query = User.select()
    if with_count:
        query = (query
                 .select_extend(fn.COUNT(Tweet.id).alias('count'))
                 .join(Tweet, JOIN.LEFT_OUTER)
                 .group_by(User))
    return query

from_(*sources)

参数: 来源– FROM 子句的零个或多个来源。
指定应在 FROM 子句中使用哪些类表对象。

User = Table('users')
Tweet = Table('tweets')
query = (User
         .select(User.c.username, Tweet.c.content)
         .from_(User, Tweet)
         .where(User.c.id == Tweet.c.user_id))
for row in query.execute(db):
    print(row['username'], '->', row['content'])

join(dest[, join_type=‘INNER’[, on=None]])

参数:

  • dest – 一个表格或类似表格的对象。

  • join_type ( str ) – JOIN 的类型,默认为“INNER”。

  • on ( Expression ) – 连接谓词。
    连接类型可以是以下之一:

  • JOIN.INNER

  • JOIN.LEFT_OUTER

  • JOIN.RIGHT_OUTER

  • JOIN.FULL

  • JOIN.FULL_OUTER

  • JOIN.CROSS
    表达一个 JOIN:

User = Table('users', ('id', 'username'))
Note = Table('notes', ('id', 'user_id', 'content'))

query = (Note
         .select(Note.content, User.username)
         .join(User, on=(Note.user_id == User.id)))

group_by(*columns)

参数: 价值观– 要分组的零个或多个类似列的对象。
定义 GROUP BY 子句。任何先前指定的值都将被覆盖。

此外,要指定给定表上的所有列,您可以传递表/模型对象来代替各个列。

例子:

query = (User
         .select(User, fn.Count(Tweet.id).alias('count'))
         .join(Tweet)
         .group_by(User))

group_by_extend(*columns)

参数: 价值观– 要分组的零个或多个类似列的对象。
使用给定的列扩展 GROUP BY 子句。

having( *expressions)

参数: 表达式– 包含在 HAVING 子句中的零个或多个表达式。
在查询的 HAVING 子句中包含给定的表达式。这些表达式将与任何先前指定的 HAVING 表达式一起进行 AND 运算。

distinct(*columns)

参数: 列– 零个或多个柱状对象。
指示此查询是否应使用 DISTINCT 子句。通过指定单个值True的查询将使用简单的 SELECT DISTINCT。指定一个或多个列将导致 SELECT DISTINCT ON。

window( *windows)

参数: 视窗– 零个或多个Window对象。
定义 WINDOW 子句。任何先前指定的值都将被覆盖。

例子:

# Equivalent example Using a Window() instance instead.
window = Window(partition_by=[Sample.counter])
query = (Sample
         .select(
            Sample.counter,
            Sample.value,
            fn.AVG(Sample.value).over(window))
         .window(window)  # Note call to ".window()"
         .order_by(Sample.counter))

for_update([for_update=True[, of=None[, nowait=None]]])

参数:

  • for_update – 布尔值或指示所需表达式的字符串,例如“FOR SHARE”。
  • of – 一个或多个要限制锁定的模型。
  • nowait ( bool ) – 锁定时指定 NOWAIT 选项。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用 FastAPI 中 Tortoise-ORM、SQLAlchemy 和 peewee 进行 ORM 查询的示例。 ## Tortoise-ORM ```python from fastapi import FastAPI from tortoise import fields from tortoise.contrib.fastapi import register_tortoise, HTTPNotFoundError from tortoise.models import Model from tortoise import Tortoise class User(Model): id = fields.IntField(pk=True) name = fields.CharField(50) email = fields.CharField(50) class Meta: table = "users" app = FastAPI() @app.on_event("startup") async def startup(): await Tortoise.init( db_url="sqlite://db.sqlite3", modules={"models": ["main"]} ) await Tortoise.generate_schemas() @app.on_event("shutdown") async def shutdown(): await Tortoise.close_connections() @app.get("/users") async def get_users(): users = await User.all() return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = await User.get_or_none(id=user_id) if user is None: raise HTTPNotFoundError return user register_tortoise( app, db_url="sqlite://db.sqlite3", modules={"models": ["main"]}, generate_schemas=True, add_exception_handlers=True ) ``` ## SQLAlchemy ```python from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String(50)) email = Column(String(50)) engine = create_engine("sqlite:///db.sqlite3") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) app = FastAPI() @app.get("/users") async def get_users(): db = SessionLocal() users = db.query(User).all() db.close() return users @app.get("/users/{user_id}") async def get_user(user_id: int): db = SessionLocal() user = db.query(User).filter(User.id == user_id).first() db.close() if user is None: raise HTTPNotFoundError return user ``` ## peewee ```python from fastapi import FastAPI from peewee import SqliteDatabase, Model, CharField, IntegerField from playhouse.shortcuts import model_to_dict db = SqliteDatabase("db.sqlite3") class User(Model): id = IntegerField(primary_key=True) name = CharField() email = CharField() class Meta: database = db table_name = "users" app = FastAPI() @app.on_event("startup") def startup(): db.connect() db.create_tables([User]) @app.on_event("shutdown") def shutdown(): db.close() @app.get("/users") async def get_users(): users = [model_to_dict(user) for user in User.select()] return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = User.get_or_none(User.id == user_id) if user is None: raise HTTPNotFoundError return model_to_dict(user) ``` 注意:以上示例中的代码仅用于演示 ORM 查询的基本用法,并且没有进行错误处理。在实际应用中,你应该根据需要添加适当的错误处理和安全性检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岳涛@心馨电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值