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

发布于:2024-03-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

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)
user
  id AUTO PK
  email TEXT
  name TEXT
  dob DATE

index(es)
  email UNIQUE

>>> print_model(Tweet)
tweet
  id AUTO PK
  user INT FK: User.id
  title TEXT
  content TEXT
  timestamp DATETIME
  is_published BOOL

index(es)
  user_id
  is_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_database

register_database(FirebirdDatabase, 'firebird')
db = connect('firebird://my-firebird-db')
本文含有隐藏内容,请 开通VIP 后查看