文章目录
- 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')