当前位置: 首页 > news >正文

【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')

相关文章:

  • Unity 学习日记 12.小球撞击冰块游戏
  • RabbitMQ介绍
  • 【WPF应用16】WPF如何让Canvas上的元素响应鼠标点击事件?
  • 企业产品网络安全建设日志0328
  • 单源最短路径
  • Qlib-Server:量化库数据服务器
  • Apache HBase(二)
  • 康耐视visionpro-CogBlobTool工具详细说明
  • 指标监控和归因分析——数据异常波动
  • ssm网上订餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目采用线性算法
  • 安装paddle detection心得
  • FFmpeg开发笔记(十五)详解MediaMTX的推拉流
  • 计算机专业学习单片机有什么意义吗?
  • git2consul+consul+gitlab连接
  • 自动发卡平台源码优化版,支持个人免签支付
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Android 控件背景颜色处理
  • Angular2开发踩坑系列-生产环境编译
  • Javascript编码规范
  • opencv python Meanshift 和 Camshift
  • 笨办法学C 练习34:动态数组
  • 什么是Javascript函数节流?
  • 使用Swoole加速Laravel(正式环境中)
  • 思维导图—你不知道的JavaScript中卷
  • 写代码的正确姿势
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (实战篇)如何缓存数据
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)linux 命令大全
  • (转)为C# Windows服务添加安装程序
  • .htaccess配置重写url引擎
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 获取url的方法
  • .net 受管制代码
  • .NET多线程执行函数
  • .net反编译工具
  • .NET简谈设计模式之(单件模式)
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net中应用SQL缓存(实例使用)
  • @Autowired和@Resource装配
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C]编译和预处理详解
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽