【Python百日进阶-Web开发-Peewee】Day275 - Peewee API文档 - 查询生成器组件

11.6 Query-builder Internals 查询生成器组件

11.6.1 class AliasManager

class AliasManager

管理 SELECT 查询中分配给Source对象的别名,以避免在单个查询中使用多个源时出现模糊引用。

add(source)

在当前范围内将源添加到 AliasManager 的内部注册表。别名将使用以下方案自动生成(其中每个缩进级别引用一个新范围):

参数: source(source)——让经理知道新的source。如果已经添加了源,则调用是无操作的。

get(source[, any_depth=False])

返回当前范围内源的别名。如果源没有别名,它将被赋予下一个可用的别名。

参数: source( Source ) – 应检索其别名的源。
返回: 已分配给源的别名,或下一个可用的别名。
返回类型: 字符串

setitem(source, alias)

在当前范围内手动设置源的别名。

参数: source( Source ) – 我们为其设置别名的源。

push()

将新范围压入堆栈。

pop()

从堆栈中弹出范围。

11.6.2 class State

class State(scope[, parentheses=False[, subquery=False[, **kwargs]]])

用于表示给定范围内状态的轻量级对象。在 SQL 生成期间,访问的每个对象Context都可以检查状态。该类State允许 Peewee 执行以下操作:

对字段类型或 SQL 表达式使用通用接口,但使用供应商特定的数据类型或运算符。
根据. Column_scope
确保正确使用括号。
参数:
scope ( int ) – 状态处于活动状态时要应用的范围规则。
括号( bool ) – 将包含的 SQL 包装在括号中。
subquery ( bool ) – 当前状态是否是外部查询的子查询。
kwargs ( dict ) – 应在当前状态下应用的任意设置。

11.6.3 class Context

class Context(**settings)

将 Peewee 结构转换为参数化的 SQL 查询。

Peewee 结构都应该实现一个__sql__方法,该方法将在 SQL 生成期间由Context类调用。__sql__方法接受一个参数,即Context实例,它允许递归下降以及范围和状态的自省。

scope

返回当前活动的范围规则。

parentheses

返回当前状态是否包含在括号中。

subquery

返回当前状态是否是另一个查询的子状态。

scope_normal([**kwargs])

默认范围。source由别名引用,列由source的虚线路径引用。

scope_source([**kwargs])

定义源时使用的范围,例如在 SELECT 查询的列列表和 FROM 子句中。此范围用于定义源的完全限定名称并分配别名。

scope_values([**kwargs])

用于 UPDATE、INSERT 或 DELETE 查询的范围,我们不是通过别名引用源,而是直接引用它。同样,由于只有一个表,因此不需要通过点路径引用列。

scope_cte([**kwargs])

生成公共表表达式的内容时使用的范围。在生成 CTE 的定义时(而不是仅仅引用一个),在 WITH 语句之后使用。

scope_column([**kwargs])

为列生成 SQL 时使用的范围。确保使用正确的别名呈现列。之所以需要,是因为在引用子选择的内部投影时,Peewee 会将完整的 SELECT 查询呈现为列的“源”(而不是查询的别名 + . + 列)。当我们只需要别名时,这个范围允许我们避免呈现完整的查询。

sql(obj)

将可组合的 Node 对象、子上下文或其他对象附加到查询 AST。Python 值,例如整数、字符串、浮点数等,被视为参数化值。

返回: 更新的 Context 对象。

literal(keyword)

将字符串文字附加到当前查询 AST。

返回: 更新的 Context 对象。

parse(node)

参数: 节点( Node ) – Node 子类的实例。
返回: 由(sql,参数)组成的 2 元组。
将给定节点转换为 SQL AST 并返回由 SQL 查询和参数组成的 2 元组。

query()

返回: 由上下文的 (sql, parameters) 组成的 2 元组。

11.7 常量和助手

11.7.1 class Proxy

class Proxy

为另一个对象创建代理或占位符。

initialize(obj)

参数: 对象– 要代理的对象。
将代理绑定到给定对象。之后,代理上的所有属性查找和方法调用都将发送到给定对象。

任何已注册的回调都将被调用。

attach_callback(callback)

参数: 打回来– 接受单个参数的函数,即绑定对象。
返回: self
添加在代理初始化时要执行的回调。

class DatabaseProxy

适合用作 Database实例占位符的代理子类。

有关使用的详细信息,请参阅动态定义数据库。

chunked(iterable,n )

参数:
iterable – 一个可迭代对象,它是要分块的数据的source。
n ( int ) – 块大小
返回:
一个新的迭代,它产生n长度的源数据块。

将大型数据列表分解为较小块的有效实现。

用法:

it = range(10)  # An iterable that yields 0...9.

# Break the iterable into chunks of length 4.
for chunk in chunked(it, 4):
    print(', '.join(str(num) for num in chunk))

# PRINTS:
# 0, 1, 2, 3
# 4, 5, 6, 7
# 8, 9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值