【Python百日进阶-Web开发-Peewee】Day290 - Peewee 的扩展(十)架构迁移(下)/ 映射

文章目录

      • 13.16.3 迁移 API
        • migrate
        • class SchemaMigrator(database)
        • class PostgresqlMigrator
        • class SqliteMigrator
        • class MySQLMigrator
    • 13.17 映射 Reflection
        • generate_models
        • print_model
        • print_table_sql
        • class Introspector
        • classmethod from_database
    • 13.18 数据库网址 Database URL
        • connect
        • parse
        • register_database

13.16.3 迁移 API

migrate
migrate(*operations)

执行一个或多个模式更改操作。

用法:

migrate(migrator.add_column('some_table', 'new_column', CharField(default='')),migrator.create_index('some_table', ('new_column',)),
)
class SchemaMigrator(database)
class SchemaMigrator(database)

参数: 数据库– 一个Database实例。
SchemaMigrator负责生成模式更改语句。

add_column(table, column_name, field)

参数:
table ( str ) – 要添加列的表的名称。
column_name ( str ) – 新列的名称。
field ( Field ) – 一个Field实例。
在提供的表中添加一个新列。提供的field将用于生成适当的列定义。

笔记
如果该字段不可为空,则必须指定一个默认值。

笔记
对于非空字段,该字段最初将作为空字段添加,然后UPDATE将执行一条语句以使用默认值填充列。最后,该列将被标记为非空。

drop_column(table, column_name[, cascade=True])

参数:

  • table ( str ) – 要从中删除列的表的名称。
  • column_name ( str ) – 要删除的列的名称。
  • cascade ( bool ) – 是否应使用CASCADE删除列。

rename_column(table, old_name, new_name)

参数:

  • table ( str ) – 包含要重命名的列的表的名称。
  • old_name ( str ) – 列的当前名称。
  • new_name ( str ) – 列的新名称。

add_not_null(table, column)

参数:

  • table ( str ) – 包含列的表的名称。
  • column ( str ) – 要使其不可为空的列的名称。

drop_not_null(table, column)

参数:

  • table ( str ) – 包含列的表的名称。
  • column ( str ) – 要为空的列的名称。

alter_column_type(table, column, field[, cast=None])

参数:

  • table ( str ) – 表的名称。
  • column_name ( str ) – 要修改的列的名称。
  • field ( Field ) –Field表示新数据类型的实例。
  • cast –(仅限 postgres)如果数据类型不兼容,则指定一个强制转换表达式,例如column_name::int. 可以作为字符串或Cast实例提供。
    更改列的数据类型。应谨慎使用此方法,因为您的数据库可能无法很好地支持使用不兼容的类型。

rename_table(old_name, new_name)

参数:

  • old_name ( str ) – 表的当前名称。
  • new_name ( str ) – 表的新名称。

add_index(table, columns[, unique=False[, using=None]])

参数:

  • table ( str ) – 要在其上创建索引的表的名称。
  • columns ( list ) – 应该被索引的列的列表。
  • unique ( bool ) – 新索引是否应指定唯一约束。
  • using ( str ) – 索引类型(如果支持),例如 GiST 或 GIN。

drop_index(table, index_name)

参数:

  • table ( str ) – 包含要删除的索引的表的名称。
  • index_name ( str ) – 要删除的索引的名称。

add_constraint(table, name, constraint)

参数:

  • table ( str ) – 要添加约束的表。
  • name ( str ) – 用于标识约束的名称。
    约束——要么是一个Check()约束,要么是添加一个任意约束,使用SQL.

drop_constraint(table, name)

参数:

  • table ( str ) – 要从中删除约束的表。
  • name ( str ) – 要删除的约束的名称。

add_unique(table, *column_names)

参数:

  • table ( str ) – 要添加约束的表。
  • column_names ( str ) – UNIQUE 约束的一列或多列。
class PostgresqlMigrator
class PostgresqlMigrator(database)

为 Postgresql 数据库生成迁移。

set_search_path(schema_name)

参数: 模式名称( str ) – 要使用的架构。
为后续操作设置搜索路径(模式)。

class SqliteMigrator
class SqliteMigrator(database)

为 SQLite 数据库生成迁移。

SQLite 对查询的支持有限,因此 SQLite 目前不支持以下操作:ALTER TABLE

  • add_constraint
  • drop_constraint
  • add_unique
class MySQLMigrator
class MySQLMigrator(database)

为 MySQL 数据库生成迁移。

13.17 映射 Reflection

映射模块包含用于内省现有数据库的助手。该模块由 playhouse 中的其他几个模块在内部使用,包括DataSet和pwiz,一个模型生成器。

generate_models
generate_models(database[, schema=None[, **options]])

参数:

  • database( Database ) – 要自省的数据库实例。
  • schema ( str ) – 自省的可选模式。
  • options – 任意选项,详见Introspector.generate_models()。
    返回:
    将dict表名映射到模型类。

为给定数据库中的表生成模型。有关如何使用此功能的示例,请参阅交互式使用 Peewee部分。

例子:

>>> from peewee import *
>>> from playhouse.reflection import generate_models
>>> db = PostgresqlDatabase('my_app')
>>> models = generate_models(db)
>>> list(models.keys())
['account', 'customer', 'order', 'orderitem', 'product']>>> globals().update(models)  # Inject models into namespace.
>>> for cust in customer.select():  # Query using generated model.
...     print(cust.name)
...Huey Kitty
Mickey Dog
print_model
print_model(model)

参数: 模型( Model ) – 要打印的模型类
返回: 没有返回值
打印模型类的用户友好描述,对调试或交互式使用很有用。目前,这会打印表名以及所有字段及其数据类型。交互式使用Peewee部分包含一个示例。

示例输出:

>>> from playhouse.reflection import print_model
>>> print_model(User)
userid AUTO PKemail TEXTname TEXTdob DATEindex(es)email UNIQUE>>> print_model(Tweet)
tweetid AUTO PKuser INT FK: User.idtitle TEXTcontent TEXTtimestamp DATETIMEis_published BOOLindex(es)user_idis_published, timestamp
print_table_sql
print_table_sql(model)

参数: 模型( Model ) – 要打印的模型
返回: 没有返回值
打印给定模型类的 SQL,这对于调试或交互式使用可能很有用。有关示例用法,请参阅交互式使用 Peewee部分。请注意,索引和约束不包含在此函数的输出中。CREATE TABLE

示例输出:

>>> from playhouse.reflection import print_table_sql
>>> print_table_sql(User)
CREATE TABLE IF NOT EXISTS "user" ("id" INTEGER NOT NULL PRIMARY KEY,"email" TEXT NOT NULL,"name" TEXT NOT NULL,"dob" DATE NOT NULL
)>>> print_table_sql(Tweet)
CREATE TABLE IF NOT EXISTS "tweet" ("id" INTEGER NOT NULL PRIMARY KEY,"user_id" INTEGER NOT NULL,"title" TEXT NOT NULL,"content" TEXT NOT NULL,"timestamp" DATETIME NOT NULL,"is_published" INTEGER NOT NULL,FOREIGN KEY ("user_id") REFERENCES "user" ("id")
)
class Introspector
class Introspector(metadata[, schema=None])

元数据可以通过实例化从数据库中提取 Introspector。与其直接实例化这个类,不如推荐使用工厂方法 from_database()。

classmethod from_database

classmethod from_database(database[, schema=None])
参数:

  • database——一个Database实例。
  • schema( str ) – 可选架构(某些数据库支持)。
    创建一个Introspector适用于给定数据库的实例。

用法:

db = SqliteDatabase('my_app.db')
introspector = Introspector.from_database(db)
models = introspector.generate_models()# User and Tweet (assumed to exist in the database) are
# peewee Model classes generated from the database schema.
User = models['user']
Tweet = models['tweet']

generate_models([skip_invalid=False[, table_names=None[, literal_column_names=False[, bare_fields=False[, include_views=False]]]]])

参数:

  • skip_invalid ( bool ) – 跳过名称为无效 python 标识符的表。
  • table_names ( list ) – 要生成的表名列表。如果未指定,则为所有表生成模型。
  • literal_column_names ( bool ) – 按原样使用列名。默认情况下,列名是“python-ized”,即混合大小写变为小写。
  • bare_fields –仅限 SQLite。不要为自省列指定数据类型。
  • include_views – 也为 VIEW 生成模型。
    返回:
    将表名映射到模型类的字典。

内省数据库,读入表、列和外键约束,然后生成一个字典,将每个数据库表映射到一个动态生成的Model类。

13.18 数据库网址 Database URL

该模块包含一个帮助函数,用于从 URL 连接字符串生成数据库连接。

connect
connect(url, **connect_params)

从给定的连接 URL创建一个Database实例。

例子:

  • sqlite:///my_database.db将为当前目录中的文件创建一个SqliteDatabase实例。my_database.db

  • sqlite:///:memory:将创建一个内存SqliteDatabase实例。

  • postgresql://postgres:my_password@localhost:5432/my_database将创建一个PostgresqlDatabase实例。提供了用户名和密码,以及要连接的主机和端口。

  • mysql://user:passwd@ip:port/my_dbMySQLDatabase将为本地 MySQL 数据库my_db创建一个实例。

  • mysql+pool://user:passwd@ip:port/my_db?max_connections=20&stale_timeout=300PooledMySQLDatabase将为本地 MySQL 数据库my_db创建一个实例,max_connections 设置为 20,stale_timeout 设置为 300 秒。
    支持的方案:

  • apsw:APSWDatabase

  • mysql:MySQLDatabase

  • mysql+pool:PooledMySQLDatabase

  • postgres:PostgresqlDatabase

  • postgres+pool:PooledPostgresqlDatabase

  • postgresext:PostgresqlExtDatabase

  • postgresext+pool:PooledPostgresqlExtDatabase

  • sqlite:SqliteDatabase

  • sqliteext:SqliteExtDatabase

  • sqlite+pool:PooledSqliteDatabase

  • sqliteext+pool:PooledSqliteExtDatabase
    用法:

import os
from playhouse.db_url import connect# Connect to the database URL defined in the environment, falling
# back to a local Sqlite database if no database URL is specified.
db = connect(os.environ.get('DATABASE') or 'sqlite:///default.db')
parse
parse(url)

将给定 URL 中的信息解析为包含 database、host、port和user/或的字典password。可以在 URL 查询字符串中传递其他连接参数。

如果您使用的是自定义数据库类,则可以使用该parse() 函数从 URL 中提取信息,然后将这些信息传递给您的数据库对象。

register_database
register_database( db_class , *names )

参数:

  • db_class – 的子类Database。
  • names – 在 URL 中用作方案的名称列表,例如 ‘sqlite’ 或 ‘firebird’
    在指定名称下注册其他数据库类。此功能可用于扩展connect()功能以支持其他方案。Firebird假设您有一个名为 的自定义数据库类FirebirdDatabase。
from playhouse.db_url import connect, register_databaseregister_database(FirebirdDatabase, 'firebird')
db = connect('firebird://my-firebird-db')

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

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

相关文章

进程知识点

引用的文章:操作系统——进程通信(IPC)_系统ipc-CSDN博客 面试汇总(五):操作系统常见面试总结(一):进程与线程的相关知识点 - 知乎 (zhihu.com) 二、进程的定义、组成、组成方式及特征_进程的组成部分必须包含-CSDN博…

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器

按键控制LED LED模块 左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平 右上角PA0,把上拉电阻想象成弹簧 当按键…

大数据手写面试题Scala语言实现大全(持续更新)

在大数据领域,Scala语言因其强大的函数式编程特性和对并发处理的良好支持而成为了开发者们的热门选择。有些面试官,为了考验面试者的基本功,需要让手写一些面试题,以数据结构和算法类的居多。本文将为您提供一些常见的Scala手写面试题及参考答案,帮助您在面试或工作中更好…

C# 命名空间的两种定义哦写法与区别

这两种写法在C#中都是有效的,但是它们代表了不同的语法风格和C#版本特性。 第一种写法: namespace Nebula.PDF; public class PdfDocument {}这是C# 9.0及更高版本中引入的顶级语句(top-level statements)特性。它允许你直接在文…

c++中的菱形继承

c中的菱形继承 class Animal { public:int m_age; }; class Sheep:public Animal {}; class Tuo:public Animal{}; class SheepTuo :public Sheep , public Tuo{}; SheepTuo st; st.m_age 18; m_age是谁的无法区分 class Animal { public:int m_age; }; class Sheep:virtua…

ES的集群节点发现故障排除指南(3)- end

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容,第三部分,结束。 原文参考及相关内容: 英文原文(官网) 第一部分-(1) 第二部分-(2) 节点无法发现或…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样,今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些! 面试题分享 1. Is Java Platform Independent if then how?( Java平台是独立的吗?) Yes, Java is a…

[数据结构]插入和希尔排序

一、插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排…

Protocol Buffers(通常简称为protobuf)是一种由Google开发的用于序列化结构化数据的接口描述语言

Protocol Buffers(通常简称为protobuf) protobuf是一种由Google开发的用于序列化结构化数据的接口描述语言。它可以用于通信协议、数据存储等领域。以下是protobuf的一些重要特点和概念: IDL(接口描述语言)&#xff1…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文 概述 在…

Python数据可视化:用Matplotlib和Seaborn绘制精美图表

Python数据可视化:用Matplotlib和Seaborn绘制精美图表 数据可视化是数据分析中的重要环节,它能够帮助我们以直观的方式理解数据和分析结果。Python中的Matplotlib和Seaborn库是两个非常强大的数据可视化工具,它们提供了丰富的功能来创建各种…

FastAPI+React全栈开发12 搭建FastAPI开发环境

Chapter03 Getting Started with FastAPI 12 Technical requirements FastAPIReact全栈开发12 搭建FastAPI开发环境 For this chapter, you will need the following: Python setupVirtual environmentsCode editor and pluginsTerminalREST clients 对于这一章&#xff0…

Day54:WEB攻防-XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

目录 XSS跨站-攻击利用-凭据盗取 XSS跨站-攻击利用-数据提交 XSS跨站-攻击利用-flash钓鱼 XSS跨站-攻击利用-溯源综合 知识点: 1、XSS跨站-攻击利用-凭据盗取 2、XSS跨站-攻击利用-数据提交 3、XSS跨站-攻击利用-网络钓鱼 4、XSS跨站-攻击利用-溯源综合 漏洞原理…

OpenCV摄像头和视频处理

OpenCV视频捕获 一、引言 视频捕获是计算机视觉中常见的一项任务,它涉及从视频文件或摄像头实时流中读取帧,并对其进行处理和分析。OpenCV(开源计算机视觉库)为视频捕获提供了强大的支持,使得这一任务变得简单高效。…

计算机网络链路层

数据链路 链路是从一个节点到相邻节点之间的物理线路(有线或无线) 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤: 节点a的数据链路层将网络层交下来的包添…

深度学习pytorch——卷积神经网络(持续更新)

计算机如何解析图片? 在计算机的眼中,一张灰度图片,就是许多个数字组成的二维矩阵,每个数字就是此点的像素值(图-1)。在存储时,像素值通常位于[0, 255]区间,在深度学习中&#xff0…

重写、重定义(隐藏)、重载区别

1、重载是在同一个作用域中比如在同一个类中、函数名一样参数不同 2、重写: 满足多态的条件:(1)虚函数前面带有virtual函数名、返回值、参数相同(2)重写函数体 3、重定义也叫隐藏、不满足重写的就是重定义

素描石膏像的眼睛:传神的关键

素描石膏像的眼睛:如何在素描绘画中画出眼睛的传神?关键要点是什么 在素描石膏像的眼睛时,要画出传神的效果,关键要点包括以下几个方面: 理解眼睛的结构:首先,需要理解眼睛的基本结构&#xff…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…