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

11.2.11 class Negated(node)

class Negated(node)

表示一个否定的类似列的对象。

11.2.12 class Value

classValue(value[, converter=None[, unpack=True]])

参数:

  • value – Python 对象或标量值。
    converter——用于将值转换为数据库可以理解的类型的函数。
    unpack ( bool ) – 是否应将列表或元组解压缩到值列表中或按原样处理。
    要在参数化查询中使用的值。调用者有责任确保传入的值可以适应数据库驱动程序理解的类型。
AsIs(value)

表示按Value原样处理并直接传递回数据库驱动程序的 a。如果您正在使用接受本机 Python 数据类型的数据库扩展并且您不希望 Peewee 对这些值进行任何处理,这可能会很有用。

11.2.13 class Cast

class Cast(node, cast)

参数:

  • node——一个类似列的对象。
    -cast ( str ) – 要转换为的类型。
    表示一个表达式。CAST( AS )

11.2.14 class Ordering

class Ordering(node, direction[, collation=None[, nulls=None]])

参数:

  • node——一个类似列的对象。
  • direction( str ) – ASC 或 DESC
  • collat​​ion ( str ) – 用于排序的排序规则名称。
  • nulls ( str ) – 对空值进行排序(FIRST 或 LAST)。
    表示按列状对象排序。

Postgresql 支持非标准子句(“NULLS FIRST/LAST”)。CASEPeewee 将自动对不支持此功能的数据库(Sqlite / MySQL)使用等效语句。

collate([collation=None])

参数: 整理( str ) – 用于排序的排序规则名称。

Asc(node[, collation=None[, nulls=None]])

用于实例化上升Ordering对象的简写。

Desc(node[, collation=None[, nulls=None]])

用于实例化下降Ordering对象的简写。

classExpression(lhs, op, rhs[, flat=True])

参数:

  • lhs——左侧。
  • op——操作。
  • rhs——右手边。
  • flat ( bool ) – 是否将表达式括在括号中。
    表示形式为 (lhs op rhs) 的二进制表达式,例如 (foo + 1)。

11.2.15 class Entity

class Entity(*path)

参数: 小路– 构成实体名称的虚线路径的组件。
表示查询中引用的实体,例如表、列、别名。该名称可能由多个组件组成,例如“a_table”.“column_name”。

getattr(self, attr)

用于创建子实体的工厂方法。

11.2.16 class SQL

class SQL(sql[, params=None])

参数:
sql ( str ) – SQL 查询字符串。
params ( tuple ) – 查询参数(可选)。
表示参数化的 SQL 查询或查询片段。

Check(constraint[, name=None])

参数:

  • constraint( str ) – 约束 SQL。
  • name ( str ) – 约束名称。
    表示一个 CHECK 约束。

警告
name将约束与列定义一起内联时,MySQL 可能不支持参数。解决方案是将命名Check约束放在模型Meta.constraints
列表中,而不是字段实例constraints=[…]列表中。

11.2.17 class Function

class Function(name, arguments[, coerce=True[, python_value=None]])

参数:

  • name ( str ) – 函数名称。
  • arguments ( tuple ) – 函数的参数。
  • coerce ( bool ) – 从游标读取函数返回值时是否将函数结果强制转换为特定数据类型。
  • python_value ( callable ) – 用于转换游标返回值的函数。
    表示任意 SQL 函数调用。

笔记
与其直接实例化这个类,不如建议使用fnhelper。

fn用于调用任意 SQL 函数的示例:

# Query users and count of tweets authored.
query = (User
         .select(User.username, fn.COUNT(Tweet.id).alias('ct'))
         .join(Tweet, JOIN.LEFT_OUTER, on=(User.id == Tweet.user_id))
         .group_by(User.username)
         .order_by(fn.COUNT(Tweet.id).desc()))
over([partition_by=None[, order_by=None[, start=None[, end=None[, window=None[, exclude=None]]]]]])

参数:

  • partition_by ( list ) – 要分区的列列表。
  • order_by ( list ) – 排序窗口的列/表达式列表。
  • start –SQL表示窗口范围开始的实例或字符串。
  • end --SQL表示窗口范围结束的实例或字符串。
  • frame_type ( str ) Window.RANGE–Window.ROWS或 Window.GROUPS.
  • window( Window ) – 一个Window实例。
  • exclude – 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。

笔记
有关在 Peewee 中使用窗口函数的深入指南,请参阅窗口函数部分。

例子:

# Using a simple partition on a single column.
query = (Sample
         .select(
            Sample.counter,
            Sample.value,
            fn.AVG(Sample.value).over([Sample.counter]))
         .order_by(Sample.counter))

# 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))

# Example using bounded window.
query = (Sample
         .select(Sample.value,
                 fn.SUM(Sample.value).over(
                    partition_by=[Sample.counter],
                    start=Window.CURRENT_ROW,  # current row
                    end=Window.following()))  # unbounded following
         .order_by(Sample.id))
filter(where)

参数: 在哪里– 过滤聚合的表达式。
向聚合函数添加子句。评估 where 表达式以确定将哪些行提供给聚合函数。Postgres 和 SQLite 支持此 SQL 功能。FILTER (WHERE…)

coerce([coerce=True])

参数: 胁迫( bool ) – 是否尝试将函数调用结果强制转换为 Python 数据类型。
当 coerce 为True时,使用几种启发式方法推断目标数据类型。阅读BaseModelCursorWrapper._initialize_columns 方法的源代码以了解其工作原理。

python_value([func=None])

参数: python_value( callable ) – 用于转换游标返回值的函数。
指定转换数据库游标返回的值时要使用的特定函数。例如:

# Get user and a list of their tweet IDs. The tweet IDs are
# returned as a comma-separated string by the db, so we'll split
# the result string and convert the values to python ints.
convert_ids = lambda s: [int(i) for i in (s or '').split(',') if i]
tweet_ids = (fn
             .GROUP_CONCAT(Tweet.id)
             .python_value(convert_ids))

query = (User
         .select(User.username, tweet_ids.alias('tweet_ids'))
         .group_by(User.username))

for user in query:
    print(user.username, user.tweet_ids)

# e.g.,
# huey [1, 4, 5, 7]
# mickey [2, 3, 6]
# zaizee []
fn()

帮助器fn()实际上是一个实例,Function 它实现了一个__getattr__钩子,为调用 SQL 函数提供了一个很好的 API。

要创建代表 SQL 函数调用的节点,请使用函数名称作为属性fn,然后像调用 Python 函数一样提供参数:

# List users and the number of tweets they have authored,
# from highest-to-lowest:
sql_count = fn.COUNT(Tweet.id)
query = (User
         .select(User, sql_count.alias('count'))
         .join(Tweet, JOIN.LEFT_OUTER)
         .group_by(User)
         .order_by(sql_count.desc()))

# Get the timestamp of the most recent tweet:
query = Tweet.select(fn.MAX(Tweet.timestamp))
max_timestamp = query.scalar()  # Retrieve scalar result from query.

函数调用可以像其他任何东西一样被组合和嵌套:

# Get users whose username begins with "A" or "a":
a_users = User.select().where(fn.LOWER(fn.SUBSTR(User.username, 1, 1)) == 'a')

11.2.18 class Window

class Window([partition_by=None[, order_by=None[, start=None[, end=None[, frame_type=None[, extends=None[, exclude=None[, alias=None]]]]]]]])

参数:

  • partition_by ( list ) – 要分区的列列表。
  • order_by ( list ) – 要排序的列列表。
  • start –SQL表示窗口范围开始的实例或字符串。
  • end --SQL表示窗口范围结束的实例或字符串。
  • frame_type ( str ) Window.RANGE–Window.ROWS或 Window.GROUPS.
  • extends --Window要扩展的定义。或者,您可以指定窗口的别名。
  • exclude – 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。
  • alias ( str ) – 窗口的别名。
    表示一个WINDOW 子句。

笔记
有关在 Peewee 中使用窗口函数的深入指南,请参阅窗口函数部分。

RANGE

ROWS

GROUPS
指定窗口frame_type。请参阅帧类型:RANGE vs ROWS vs GROUPS。

CURRENT_ROW
引用当前行以在开始/结束子句或框架排除参数中使用。

NO_OTHERS

GROUP
TIES
指定窗框排除参数。

staticpreceding([value=None])
参数: 价值– 前面的行数。如果None是无界的。

生成适合作为 start窗口范围参数传入的 SQL 的便捷方法。

staticfollowing([value=None])
参数: 价值– 后面的行数。如果None是无界的。

生成适合作为 end窗口范围参数传入的 SQL 的便捷方法。

as_rows()

as_range()

as_groups()
指定帧类型。

extends([window=None])
参数: 窗户( Window ) –Window要扩展的定义。或者,您可以指定窗口的别名。

exclude([frame_exclusion=None])
参数: 框架排除– 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。

alias([alias=None])
参数: 别名( str ) – 用于窗口的别名。

Case(predicate, expression_tuples[, default=None]])

参数:

  • predicate – CASE 查询的谓词(可选)。
  • expression_tuples – 要评估的一个或多个案例。
  • default – 默认值(可选)。
    回报:
    CASE 语句的表示。

例子:

Number = Table('numbers', ('val',))

num_as_str = Case(Number.val, (
    (1, 'one'),
    (2, 'two'),
    (3, 'three')), 'a lot')

query = Number.select(Number.val, num_as_str.alias('num_str'))

# The above is equivalent to:
# SELECT "val",
#   CASE "val"
#       WHEN 1 THEN 'one'
#       WHEN 2 THEN 'two'
#       WHEN 3 THEN 'three'
#       ELSE 'a lot' END AS "num_str"
# FROM "numbers"

num_as_str = Case(None, (
    (Number.val == 1, 'one'),
    (Number.val == 2, 'two'),
    (Number.val == 3, 'three')), 'a lot')
query = Number.select(Number.val, num_as_str.alias('num_str'))

# The above is equivalent to:
# SELECT "val",
#   CASE
#       WHEN "val" = 1 THEN 'one'
#       WHEN "val" = 2 THEN 'two'
#       WHEN "val" = 3 THEN 'three'
#       ELSE 'a lot' END AS "num_str"
# FROM "numbers"
  • 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、付费专栏及课程。

余额充值