【Python百日进阶-Web开发-Peewee】Day283 - Peewee 的扩展(二)apsw/sqlcipher/postgresql

文章目录

    • 13.4 apsw,一个高级的 sqlite 驱动程序
      • 13.4.1 如何使用 APSW 数据库
      • 13.4.2 apsw_ext API 说明
    • 13.5 Sqlcipher 后端
      • 13.5.1 sqlcipher_ext API 说明
    • 13.6 Postgresql 扩展
      • 13.6.1 JSON 支持
      • 13.6.2 hstore 支持

13.4 apsw,一个高级的 sqlite 驱动程序

该apsw_ext模块包含一个适合与 apsw sqlite 驱动程序一起使用的数据库类。

APSW 项目页面:https 😕/github.com/rogerbinns/apsw

APSW 是一个非常简洁的库,它在 SQLite 的 C 接口之上提供了一个精简的包装器,从而可以使用 SQLite 的所有高级功能。

以下是使用 APSW 的几个原因,摘自文档:

  • APSW 提供了 SQLite 的所有功能,包括虚拟表、虚拟文件系统、blob i/o、备份和文件控制。
  • 可以跨线程共享连接,而无需任何额外的锁定。
  • 事务由您的代码显式管理。
  • APSW 可以处理嵌套事务。
  • Unicode 被正确处理。
  • APSW 更快。
    有关 apsw 和 pysqlite 之间差异的更多信息,请查看apsw 文档。

13.4.1 如何使用 APSW 数据库

from apsw_ext import *db = APSWDatabase(':memory:')class BaseModel(Model):class Meta:database = dbclass SomeModel(BaseModel):col1 = CharField()col2 = DateTimeField()

13.4.2 apsw_ext API 说明

APSWDatabase扩展SqliteExtDatabase并继承了其高级功能。

class APSWDatabase(database,**connect_kwargs )

参数:

  • database ( string ) – sqlite 数据库的文件名
  • connect_kwargs – 打开连接时传递给 apsw 的关键字参数
register_module( mod_name , mod_inst )

提供一种全局注册模块的方法。有关详细信息,请参阅有关虚拟表的文档。

参数:

  • mod_name ( string ) – 用于模块的名称
  • mod_inst ( object ) – 实现Virtual Table接口的对象
unregister_module( mod_name )

注销一个模块。

参数: 模组名称( string ) – 用于模块的名称

笔记
请务必使用模块中Field定义的子类apsw_ext ,因为它们将正确处理调整数据类型以进行存储。
例如,不要使用peewee.DateTimeField,请确保您正在导入和使用playhouse.apsw_ext.DateTimeField.

13.5 Sqlcipher 后端

笔记
尽管此扩展的代码很短,但尚未经过适当的同行评审,并且可能引入了漏洞。

另请注意,此代码依赖于sqlcipher3(python 绑定)和sqlcipher,其中的代码也可能存在漏洞,但由于这些是广泛使用的加密模块,我们可以预期那里的“短零日”。

13.5.1 sqlcipher_ext API 说明

class SqlCipherDatabase(database, passphrase, **kwargs)

SqliteDatabase存储加密数据库的子类。它没有使用标准sqlite3后端,而是使用sqlcipher3 : sqlcipher的python 包装器,而后者又是一个加密包装器sqlite3,因此 API与’s 相同,SqliteDatabase除了对象构造参数:

参数:

  • database – 要打开 [或创建] 的加密数据库文件名的路径。
  • passphrase – 数据库加密密码:至少应为 8 个字符长,但强烈建议在您的实现中强制执行更好的密码强度 标准。
    如果该database文件不存在,它将通过从passhprase.
    尝试打开现有数据库时,passhprase应与创建时使用的数据库相同。如果密码不正确,首次尝试访问数据库时将引发错误。

rekey(passphrase)

参数: passphrase( str ) – 数据库的新密码。
更改数据库的密码。

笔记
可以使用许多扩展 PRAGMA 来配置 SQLCipher。可以在SQLCipher 文档中找到 PRAGMA 列表及其描述。
例如,指定密钥派生的 PBKDF2 迭代次数(SQLCipher 3.x 中为 64K,SQLCipher 4.x 中默认为 256K):

# Use 1,000,000 iterations.
db = SqlCipherDatabase('my_app.db', pragmas={'kdf_iter': 1000000})

要使用 16KB 的密码页面大小和 10,000 个页面的缓存大小:

db = SqlCipherDatabase('my_app.db', passphrase='secret!!!', pragmas={'cipher_page_size': 1024 * 16,'cache_size': 10000})  # 10,000 16KB pages, or 160MB.

提示用户输入密码的示例:

db = SqlCipherDatabase(None)class BaseModel(Model):"""Parent for all app's models"""class Meta:# We won't have a valid db until user enters passhrase.database = db# Derive our model subclasses
class Person(BaseModel):name = TextField(primary_key=True)right_passphrase = False
while not right_passphrase:db.init('testsqlcipher.db',passphrase=get_passphrase_from_user())try:  # Actually execute a query against the db to test passphrase.db.get_tables()except DatabaseError as exc:# This error indicates the password was wrong.if exc.args[0] == 'file is encrypted or is not a database':tell_user_the_passphrase_was_wrong()db.init(None)  # Reset the db.else:raise excelse:# The password was correct.right_passphrase = True

另见:一个稍微复杂的例子。

13.6 Postgresql 扩展

postgresql 扩展模块提供了许多“postgres-only”功能,目前:

  • json 支持,包括Postgres 9.4 的jsonb。
  • hstore 支持
  • server-side cursors 服务器端游标
  • full-text search 全文检索
  • ArrayField字段类型,用于存储数组。
  • HStoreField字段类型,用于存储键/值对。
  • IntervalField字段类型,用于存储timedelta对象。
  • JSONField字段类型,用于存储 JSON 数据。
  • BinaryJSONField 数据类型的jsonbJSON字段类型。
  • TSVectorField字段类型,用于存储全文搜索数据。
  • DateTimeTZField字段类型,时区感知的日期时间字段。
    将来我想添加对更多 postgresql 功能的支持。如果您希望添加某个特定功能,请 打开 Github 问题。

警告
为了开始使用下面描述的功能,您需要使用扩展PostgresqlExtDatabase类而不是PostgresqlDatabase

下面的代码将假设您使用以下数据库和基本模型:

from playhouse.postgres_ext import *ext_db = PostgresqlExtDatabase('peewee_test', user='postgres')class BaseExtModel(Model):class Meta:database = ext_db

13.6.1 JSON 支持

peewee 对 Postgres 的原生 JSON 数据类型有基本的支持,格式为 JSONField. 从 2.4.7 版本开始,peewee 还支持 Postgres 9.4 二进制 jsonjsonb类型,通过BinaryJSONField.

警告
Postgres 从 9.2 开始原生支持 JSON 数据类型(在 9.3 中完全支持)。要使用此功能,您必须使用正确版本的 Postgres 和psycopg2 2.5 或更高版本。
要使用BinaryJSONField具有许多性能和查询优势的 ,您必须具有 Postgres 9.4 或更高版本。

笔记
您必须确保您的数据库是一个实例 PostgresqlExtDatabase才能使用JSONField。

下面是一个示例,说明如何使用 JSON 字段声明模型:

import json
import urllib2
from playhouse.postgres_ext import *db = PostgresqlExtDatabase('my_database')class APIResponse(Model):url = CharField()response = JSONField()class Meta:database = db@classmethoddef request(cls, url):fh = urllib2.urlopen(url)return cls.create(url=url, response=json.loads(fh.read()))APIResponse.create_table()# Store a JSON response.
offense = APIResponse.request('http://crime-api.com/api/offense/')
booking = APIResponse.request('http://crime-api.com/api/booking/')# Query a JSON data structure using a nested key lookup:
offense_responses = APIResponse.select().where(APIResponse.response['meta']['model'] == 'offense')# Retrieve a sub-key for each APIResponse. By calling .as_json(), the
# data at the sub-key will be returned as Python objects (dicts, lists,
# etc) instead of serialized JSON.
q = (APIResponse.select(APIResponse.data['booking']['person'].as_json().alias('person')).where(APIResponse.data['meta']['model'] == 'booking'))for result in q:print(result.person['name'], result.person['dob'])

其BinaryJSONField工作原理与常规相同,支持相同的操作JSONField,但提供了几个额外的操作来测试遏制。使用二进制 json 字段,您可以测试您的 JSON 数据是否包含其他部分 JSON 结构 ( contains(), contains_any(), contains_all()),或者它是否是较大 JSON 文档的子集 ( contained_by())。

有关更多示例,请参阅下面的JSONField和 BinaryJSONFieldAPI 文档。

13.6.2 hstore 支持

Postgresql hstore 是一个嵌入式键/值存储。使用 hstore,您可以将任意键/值对与结构化关系数据一起存储在数据库中。

要使用hstore,您需要在实例化时指定一个附加参数PostgresqlExtDatabase:

# Specify "register_hstore=True":
db = PostgresqlExtDatabase('my_db', register_hstore=True)

目前该postgres_ext模块支持以下操作:

  • 存储和检索任意字典
  • 按键或部分字典过滤
  • 更新/添加一个或多个键到现有字典
  • 从现有字典中删除一个或多个键
  • 选择键、值或 zip 键和值
  • 检索一段键/值
  • 测试密钥是否存在
  • 测试一个键是否具有非 NULL 值

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

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

相关文章

JavaScript改变this指向的三种方法

在JavaScript中,可以使用call()、apply()或bind()来改变函数的this指向。 1.call(): 通过调用函数并传入新的上下文对象作为参数,将函数内部的this关键字指向该对象。示例代码如下所示 function greet(name) {console.log("Hello " name); …

机器学习笔记 DeepFakes和换脸技术简述

一、简述 人脸检测一直是 2000 年代初的主要研究课题。差不多二十年后,这个问题基本上得到了解决,并且人脸检测在大多数编程语言中都可以作为库使用。甚至换脸技术也不是什么新鲜事,并且已经存在了好些年了。 早在2016年左右就有基于OpenCV进行面部交换的方式了,主要是基于…

第107讲:Mycat实践指南:取模分片下的水平分表详解

文章目录 1.使用取模分片水平分表2.水平分表取模分片案例2.1.准备测试的表结构2.2.配置Mycat实现范围分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分片规则配置文件2.2.3.配置Server配置文件2.2.4.重启Mycat 2.3.写入数据观察水平分表效果 1.使用取模分片水平分表 平…

LeetCode 1. 两数之和。(通过JavaScript实现)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

SVG 渐变边框在 CSS 中的应用

SVG 渐变边框在 CSS 中的应用 <template><div class"home"><div class"one"><svg width"100%" height"100%"><rect x"2" y"2" width"100%" height"100%" fill&q…

【扩散模型系列1】扩散模型背景|DDPMs|LDM

目录 概述DPMDDPM前向加噪反向去噪UNet 训练阶段推理阶段 IDDPMClassifier GuidanceGLIDELDM模型结构VAE扩散模型U-Net 训练阶段推理阶段 参考资料 概述 扩散模型&#xff1a;和其他生成模型一样&#xff0c;实现从噪声&#xff08;采样自简单的分布&#xff09;生成目标数据样…

鸿蒙开发(七)添加常用控件(上)

相信大家已经对鸿蒙开发的布局有了基本的了解。之前我们提到过&#xff0c;一个好的UI&#xff0c;离不开选择合理的布局。当然&#xff0c;也离不开适当的控件。本篇文章&#xff0c;带着大家一起学习下如何在页面里面添加常用的控件。由于控件较多&#xff0c;我会分为两篇文…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和知识产权&#xff08;IP&#xff09;&am…

关于 Runes 协议及「公开铭刻」发行机制的拓展讨论

撰文&#xff1a;MiX 编辑&#xff1a;Faust&#xff0c;极客 web3 2024 年 3 月 2 日&#xff0c;Runes 生态基础设施项目 Rune alpha 的创始人&#xff0c;在 Github 的公开议题中&#xff0c;与 Runes 协议创始人 Casey 展开了讨论&#xff0c;双方对如何拓展 Runes 协议的…

MYSQL distinct 和group by 同时使用性能急剧下降

语句&#xff1a;select distinct a from A group by a 当记录数上万&#xff0c;执行时间将达到30秒左右。 修改为 select distinct a from (select a from A group by a),执行时长会在1秒以内。 对比两条SQL 语句执行记录&#xff0c;发现修改前Handler_read_rnd_next 数量…

智慧灯杆-智慧城市照明现状分析(1)

城市道路照明是城市公共设施的重要组成部分,而随着城镇化建设的推进,城市道路照明路灯的数量越来越多,能耗越来越高,供电趋于紧张。此外,城市照明的维护工作和高昂的维护成本(人工控制、路灯巡查等),给城市管理造成了巨大的困难。管理部门需要更有效率的管理和节能方案…

支持向量机 SVM | 线性可分:软间隔模型

目录 一. 软间隔模型1. 松弛因子的解释小节 2. SVM软间隔模型总结 线性可分SVM中&#xff0c;若想找到分类的超平面&#xff0c;数据必须是线性可分的&#xff1b;但在实际情况中&#xff0c;线性数据集存在少量的异常点&#xff0c;导致SVM无法对数据集线性划分 也就是说&…

Kubernetes Operator开发实践

Operator 介绍 Operator 可以看成是 CRD Controller 的一种组合资源。Kubernetes 中的基础资源类型有 Pod、Service、Job、Deployment 等表达能力有限&#xff0c;CRD 则提供了创建新的资源类型方式&#xff1b;Controller 监听 CRD 对象实例的增、删、改事件&#xff0c;然后…

独孤思维:99%副业赚不到钱的原因

什么都学等于什么都不会。 什么都做等于什么都没做。 我遇到很多做副业的小白&#xff0c;开始信誓旦旦的说这个也要学&#xff0c;那个也要学&#xff0c;这个项目不错&#xff0c;那个项目也不错。 但结果99%的人都做不起来&#xff0c;连一个项目都没有跑通。 贪得无厌&…

GIS在地质灾害危险性评估与灾后重建中的应用

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

GSA、GSEA、ssGSEA、GSVA用到的统计学知识点

文章目录 概率密度函数&#xff08;probability density function&#xff0c;PDF&#xff09;分布函数&#xff08;Cumulative Distribution Function&#xff0c;CDF&#xff09;核密度估计&#xff08;KDE&#xff09;经验累计分布函数&#xff08;Empirical Cumulative Dis…

深入理解Vue.js的模板语法和数据绑定

Vue.js背景介绍 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;由**尤雨溪&#xff08;Evan You&#xff09;**开发并于2014年首次发布。Vue.js 的设计目标是通过简单易用的语法和灵活的组件化架构&#xff0c;帮助开发者构建交互性强、响应速度快的现代Web应用程序。 …

source not found for数组a的引用Exception

identityHashCode(数组名&#xff09; adressidentityHashCode(a)//将得到数组a的哈希值。在同一个数据类型下&#xff0c;同一对象的哈希值是一样的&#xff0c;同一哈希值对应同一对象。由于不同数据类型的变量哈希值生成算法不同&#xff0c;所以在数据类型不同的情况下&am…

关于esp8266的一些经验汇总,新手必看

说实话&#xff0c;esp8266的nodemcu 已经使用了2年多了&#xff0c;各种问题遇到过&#xff0c;就尝试各种解决&#xff0c;而现在回头来看真的是稀里糊涂的在用&#xff0c;当然这个问题也同样涉及到esp32. 因为最近打算自己打一块esp8266的板&#xff0c;之前打的比较多的是…

Redis冲冲冲——Redis分布式锁如何实现

目录 引出Redis分布式锁如何实现Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证…