【Python百日进阶-Web开发-Peewee】Day287 - Peewee 的扩展(六)字段等

文章目录

    • 13.10 字段
        • class CompressedField
        • class PickleField
    • 13.11 混合属性 Hybrid Attributes
      • 13.11.1 混合 API
        • class hybrid_method
        • class hybrid_property
    • 13.12 键/值存储 Key/Value Store
        • class KeyValue

13.10 字段

这些字段可以在playhouse.fields模块中找到。

class CompressedField
class CompressedField([compression_level=6[, algorithm='zlib'[, **kwargs]]])

参数:

  • compression_level ( int ) – 0 到 9 之间的值。
  • algorithm( str ) – 要么’zlib’要么’bz2’。
    使用指定算法存储压缩数据。该字段扩展 BlobField,透明地存储数据库中数据的压缩表示。
class PickleField
class PickleField

通过透明地酸洗和取消酸洗存储在字段中的数据来存储任意 Python 数据。该字段扩展BlobField. 如果该 cPickle模块可用,它将被使用。

13.11 混合属性 Hybrid Attributes

混合属性封装了在 Python 和SQL 级别运行的功能。混合属性的想法来自 SQLAlchemy 中的同名功能。考虑以下示例:

class Interval(Model):start = IntegerField()end = IntegerField()@hybrid_propertydef length(self):return self.end - self.start@hybrid_methoddef contains(self, point):return (self.start <= point) & (point < self.end)

混合属性的名称来自于length 属性的行为会根据是通过 Interval类还是Interval实例访问而有所不同。

如果通过实例访问,那么它的行为与您预期的一样。

但是,如果通过Interval.length类属性访问,则长度计算将表示为 SQL 表达式。例如:

query = Interval.select().where(Interval.length > 5)

此查询将等效于以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE (("t1"."end" - "t1"."start") > 5)

该playhouse.hybrid模块还包含一个装饰器,用于实现可以接受参数的混合方法。与混合属性一样,当通过模型实例访问时,函数会按原样正常执行。但是,当在类上调用混合方法时,它将生成一个 SQL 表达式。

例子:

query = Interval.select().where(Interval.contains(2))

此查询等效于以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE (("t1"."start" <= 2) AND (2 < "t1"."end"))

对于 Python 实现与 SQL 实现略有不同的情况,还有一个额外的 API。让我们为模型添加一个radius方法Interval。因为该方法计算的是绝对值,所以我们将 Pythonabs()函数用于实例部分,将fn.ABS()SQL 函数用于类部分。

class Interval(Model):start = IntegerField()end = IntegerField()@hybrid_propertydef length(self):return self.end - self.start@hybrid_propertydef radius(self):return abs(self.length) / 2@radius.expressiondef radius(cls):return fn.ABS(cls.length) / 2

巧妙的是,这两个radius实现都引用了 length混合属性!通过Interval实例访问时,半径计算将在 Python 中执行。当通过Interval 类调用时,我们将获得相应的 SQL。

例子:

query = Interval.select().where(Interval.radius < 3)

此查询等效于以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE ((abs("t1"."end" - "t1"."start") / 2) < 3)

很整洁,对吧?谢谢你的好主意,SQLAlchemy!

13.11.1 混合 API

class hybrid_method
class hybrid_method(func[, expr=None])

方法装饰器,允许定义具有实例级和类级行为的 Python 对象方法。

例子:

class Interval(Model):start = IntegerField()end = IntegerField()@hybrid_methoddef contains(self, point):return (self.start <= point) & (point < self.end)

当使用Interval实例调用时,该contains方法的行为将与您预期的一样。但是,当作为类方法调用时,将生成一个 SQL 表达式:

query = Interval.select().where(Interval.contains(2))

将生成以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE (("t1"."start" <= 2) AND (2 < "t1"."end"))

expression(expr)
用于指定 SQL 表达式生成方法的方法装饰器。

class hybrid_property
class hybrid_property(fget[, fset=None[, fdel=None[, expr=None]]])

允许定义具有实例级和类级行为的 Python 对象属性的方法装饰器。

例子:

class Interval(Model):start = IntegerField()end = IntegerField()@hybrid_propertydef length(self):return self.end - self.start@hybrid_propertydef radius(self):return abs(self.length) / 2@radius.expressiondef radius(cls):return fn.ABS(cls.length) / 2

在Interval实例上访问时,lengthandradius 属性的行为将与您预期的一样。但是,当作为类属性访问时,将生成一个 SQL 表达式:

query = (Interval.select().where((Interval.length > 6) &(Interval.radius >= 3)))

将生成以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE ((("t1"."end" - "t1"."start") > 6) AND((abs("t1"."end" - "t1"."start") / 2) >= 3)
)

13.12 键/值存储 Key/Value Store

该playhouse.kv模块包含持久字典的实现。

class KeyValue

class KeyValue([key_field=None[, value_field=None[, ordered=False[, database=None[, table_name=‘keyvalue’]]]]])
参数:

  • key_field ( Field ) – 用于键的字段。默认为 CharField. 必须有 primary_key=True。
  • value_field ( Field ) – 用于值的字段。默认为 PickleField.
  • ordered( bool ) – 数据应按键排序顺序返回。
  • database( Database ) – 存储键/值数据的数据库。如果未指定,将使用内存中的 SQLite 数据库。
  • table_name ( str ) – 数据存储的表名。
    用于存储键/值数据的类字典 API。与字典一样,支持预期的 API,但还具有接受用于获取、设置和删除项目的表达式的附加功能。

KeyValue 实例化时会自动创建表(如果它不存在) 。

使用高效的 upsert 实现来设置和更新/覆盖键/值对。

基本示例:

# Create a key/value store, which uses an in-memory SQLite database
# for data storage.
KV = KeyValue()# Set (or overwrite) the value for "k1".
KV['k1'] = 'v1'# Set (or update) multiple keys at once (uses an efficient upsert).
KV.update(k2='v2', k3='v3')# Getting values works as you'd expect.
assert KV['k2'] == 'v2'# We can also do this:
for value in KV[KV.key > 'k1']:print(value)# 'v2'
# 'v3'# Update multiple values at once using expression:
KV[KV.key > 'k1'] = 'vx'# What's stored in the KV?
print(dict(KV))# {'k1': 'v1', 'k2': 'vx', 'k3': 'vx'}# Delete a single item.
del KV['k2']# How many items are stored in the KV?
print(len(KV))
# 2# Delete items that match the given condition.
del KV[KV.key > 'k1']

contains(表达式)

参数: 表达式– 单个键或表达式
返回: 布尔值是否存在键/表达式。
例子:

>>> kv = KeyValue()
>>> kv.update(k1='v1', k2='v2')>>> 'k1' in kv
True
>>> 'kx' in kv
False>>> (KV.key < 'k2') in KV
True
>>> (KV.key > 'k2') in KV
False

len()

返回: 存储的项目计数。

getitem(expr)

参数: 表达式– 单个键或表达式。
返回: 对应于键/表达式的值。
提高: KeyError如果给定单个密钥但未找到。
例子:

>>> KV = KeyValue()
>>> KV.update(k1='v1', k2='v2', k3='v3')>>> KV['k1']
'v1'
>>> KV['kx']
KeyError: "kx" not found>>> KV[KV.key > 'k1']
['v2', 'v3']
>>> KV[KV.key < 'k1']
[]

setitem(expr, value)

参数:

  • expr – 单个键或表达式。
  • value – 为键设置的值
    设置给定键的值。如果expr是一个表达式,那么任何匹配该表达式的键都将更新它们的值。

例子:

>>> KV = KeyValue()
>>> KV.update(k1='v1', k2='v2', k3='v3')>>> KV['k1'] = 'v1-x'
>>> print(KV['k1'])
'v1-x'>>> KV[KV.key >= 'k2'] = 'v99'
>>> dict(KV)
{'k1': 'v1-x', 'k2': 'v99', 'k3': 'v99'}

delitem(expr)

参数: 表达式– 单个键或表达式。
删除给定的键。如果给出了表达式,则删除与该表达式匹配的所有键。

例子:

>>> KV = KeyValue()
>>> KV.update(k1=1, k2=2, k3=3)>>> del KV['k1']  # Deletes "k1".
>>> del KV['k1']
KeyError: "k1" does not exist>>> del KV[KV.key > 'k2']  # Deletes "k3".
>>> del KV[KV.key > 'k99']  # Nothing deleted, no keys match.

keys()

返回: 表中所有键的可迭代。

values()

返回: 表中所有值的可迭代。

items()

返回: 表中所有键/值对的可迭代对象。

update([__data=None[, **mapping]])

有效地批量插入或替换给定的键/值对。

例子:

>>> KV = KeyValue()
>>> KV.update(k1=1, k2=2)  # Sets 'k1'=1, 'k2'=2.>>> dict(KV)
{'k1': 1, 'k2': 2}>>> KV.update(k2=22, k3=3)  # Updates 'k2'->22, sets 'k3'=3.>>> dict(KV)
{'k1': 1, 'k2': 22, 'k3': 3}>>> KV.update({'k2': -2, 'k4': 4})  # Also can pass a dictionary.>>> dict(KV)
{'k1': 1, 'k2': -2, 'k3': 3, 'k4': 4}

get(expr[, default=None])

参数:

  • expr – 单个键或表达式。
  • default - 如果未找到密钥,则为默认值。
    返回:
    如果未找到单个键,则为给定键/表达式的值或默认值。

获取给定键的值。如果键不存在,则返回默认值,除非键是表达式,在这种情况下将返回空列表。

pop(expr[, default=Sentinel])

参数:

  • expr – 单个键或表达式。
  • default – 如果键不存在,则为默认值。
    返回:
    如果未找到单个键,则为给定键/表达式的值或默认值。

获取值并删除给定的键。如果键不存在,则返回默认值,除非键是表达式,在这种情况下返回空列表。

clear()

从键值表中删除所有项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04安装WordPress教程

Ubuntu22.04安装LEMP堆栈(Nginx MariaDB PHP)教程 Ubuntu22.04安装WordPress教程&#xff08;利用nginx环境和MariaDB数据库&#xff0c;安装使用WordPress&#xff09; 本教程将展示如何在 Ubuntu22.04 上安装 LEMP 堆栈。 一个软件堆栈是捆绑在一起的一组软件工具。 LEMP …

华为全套企业管理资料合集(21专题)

华为全套企业管理资料合集-知识星球下载 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制度.docx 华为公司实用性各种绩效图表汇总.doc 华为公司考勤管理制度.doc 华为IPD模式中跨部门团队成员的考核激励制度.doc 2.企业管理 华为公司人力资源…

NetCore itext7 创建、编辑PDF插入表格、图片、文字(三)

NetCore 创建、编辑PDF插入表格、图片、文字 NetCore 创建、编辑PDF插入表格、图片、文字(二) NetCore 创建、编辑PDF插入表格、图片、文字(三) 直接上代码 nuget引入 itext7 using System; using System.IO;using iText.IO.Image; using iText.Kernel.Colors; // 导入颜色…

【Spring】IoCDI详解

1. IoC详解 前面提到过IoC就是将对象的控制权交由Spring的IoC容器进行管理&#xff0c;由Spring的IoC容器创建和销毁bean&#xff0c;那么既然涉及到容器&#xff0c;就一定包含以下两方面功能&#xff1a; bean的存储bean的获取 1.1 类注解 Spring框架为了更好地服务应用程…

7-30 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起&#xff0c;开始“三天打鱼两天晒网”&#xff0c;问这个人在以后的第N天中是“打鱼”还是“晒网”&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过1000的正整数N。 输出格式&#xff1a; 在一行中输…

视频中有无声音的检测

最近遇到一个烦心的事&#xff0c;晚上车停在路边车窗被砸了&#xff0c;行车记录仪正好没安装好&#xff0c;没有拍到&#xff0c;需要对视频声音进行分析确定被砸时间&#xff0c;但我的行车记录仪是每一分钟拍一个视频&#xff0c;一晚上的视频非常多&#xff0c;听起来非常…

树梅派Raspberry Pi OS(Debian)源码交叉编译升级内核参数PAGESIZE

树梅派Raspberry Pi OS(Debian)源码交叉编译升级内核参数PAGESIZE 环境&#xff1a; device: Raspberry Pi 3 Model B Rev 1.2 os: 2024-03-15-raspios-bookworm-arm64 (Debian GNU/Linux 12 bookworm aarch64) kernel: 6.6.20rpt-rpi-v8 arch: aarch64 编译机: ubuntu 22.0…

高效物联网连接技术创新:ECWAN边缘协同自组网的未来——基于ChirpLAN窄带扩频技术的无线混合组网

物联网是指将各种物理设备通过互联网进行连接和通信的技术。它是一个庞大的网络&#xff0c;由传感器、设备、网络和云服务组成&#xff0c;旨在实现对物体的远程监测、控制和数据采集。 基于ChirpLAN窄带扩频技术的无线混合组网协议ChirpLAN&#xff0c;ChirpLAN是基于其自有的…

每天学习一个Linux命令之hostname

每天学习一个Linux命令之hostname 简介 hostname命令用于显示或设置系统的主机名。主机名是在网络环境中使用的标识符&#xff0c;可用于识别和定位服务器或设备。 基本语法 hostname [选项] [新主机名]可用选项 hostname命令有一些常用的选项&#xff0c;以下是它们的详细…

Itextpdf电子签章

印章 印章是我国特有的历史文化产物&#xff0c;古代主要用作身份凭证和行驶职权的工具。它的起源是由于社会生活的实际需要。早在商周时代&#xff0c;印章就已经产生。如今的印章已成为一种独特的&#xff0c;融实用性和艺术性为一体的艺术瑰宝。传统的印章容易被坏人、小人…

久菜盒子|毕业设计|金融|DCC-GARCH模型

在R语言中&#xff0c;提到“DCC(1,1)”通常是指使用Dynamic Conditional Correlation (DCC)模型对一组金融资产收益率之间的动态相关性进行建模。DCC模型是GARCH族模型的一个变种&#xff0c;特别适用于处理多元时间序列数据中的条件相关结构。它由Robert Engle等人提出&#…

深度学习Trick

Vscode查看文件目录 cmdshiftp选择->查看&#xff1a;将焦点置于辅助侧栏 View: Focus into Secondary Side Bar把主边栏的大纲拖入 快捷查看卷积过程&#xff0c;利用 torchinfo 在 model 下打断点F5 运行调试&#xff0c;F10 运行下一步在调试控制台输入from torchinfo…

Scrapy爬虫开发实验

什么是Scrapy&#xff1f; Scrapy是一个基于Python的强大的开源网络爬虫框架&#xff0c;用于从网站上抓取信息。它提供了广泛的功能&#xff0c;使得爬取和分析数据变得相对容易。Scrapy的特点包括&#xff1a; 强大的数据提取工具&#xff0c;支持XPath和CSS选择器。简化的…

vmware虚拟机下ubuntu扩大磁盘容量

1、扩容&#xff1a; 可以直接在ubuntu setting界面里直接扩容&#xff0c;也可通过vmware命令&#xff0c;如下&#xff1a; vmware提供一个命令行工具&#xff0c;vmware-vdiskmanager.exe&#xff0c;位于vmware的安装目录下&#xff0c;比如 C:/Program Files/VMware/VMwar…

http模块 获取http请求报文中的路径 与 查询字符串

虽然request.url已包含属性和查询字符串&#xff0c;但使用不便&#xff0c;若只需其中一个不好提取&#xff0c;于是用到了如下路径和字符串的单独查询方法&#xff1a; 一、获取路径 例如&#xff1a;我在启动谷歌端口时输入http://127.0.0.1:9000 后接了 "/search?k…

编译安装飞桨fastdeploy@FreeBSD(失败)

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xff0c;并实现&#x1f51a;端到端的推理性能优化。包括 物…

02 React 组件使用

import React, { useState } from react;// 定义一个简单的函数式组件 function Counter() {// 使用 useState hook 来创建一个状态变量 count&#xff0c;并提供修改该状态的函数 setCountconst [count, setCount] useState(0);// 在点击按钮时增加计数器的值const increment…

Gemma开源AI指南

近几个月来&#xff0c;谷歌推出了 Gemini 模型&#xff0c;在人工智能领域掀起了波澜。 现在&#xff0c;谷歌推出了 Gemma&#xff0c;再次引领创新潮流&#xff0c;这是向开源人工智能世界的一次变革性飞跃。 与前代产品不同&#xff0c;Gemma 是一款轻量级、小型模型&…

1升级powershell后才能安装WSL2--最后安装linux--Ubuntu 22.04.3 LTS

视频 https://www.bilibili.com/video/BV1uH4y1W7UX特殊开启–Hyper-V虚拟机 把一下代码保存到【a.bat】的执行文件中&#xff0c;进行Hyper-V虚拟机的安装开启【Windows 批处理文件 (.bat)】 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mu…

鸿蒙Harmony跨模块交互

1. 模块分类介绍 鸿蒙系统的模块一共分为四种&#xff0c;包括HAP两种和共享包两种 HAP&#xff08;Harmony Ability Package&#xff09; Entry&#xff1a;项目的入口模块&#xff0c;每个项目都有且只有一个。feature&#xff1a;项目的功能模块&#xff0c;内部模式和En…