sqlobject-admin 工具¶
作者 | Ian Bicking <ianb@colorstudy.com> |
---|---|
修订版 | $Rev$ |
日期 | $LastChangedDate$ |
内容
警告
此文档并不完全准确;其中一些描述的是该工具的预期功能,而不是实际功能。
特别不准确的是如何查找模块和类。
简介¶
SQLObject 中包含的 sqlobject-admin
工具允许您管理使用 SQLObject 类定义的数据库。
一些功能包括创建表、检查数据库状态、记录架构版本以及更新数据库以匹配代码中架构的版本。
要查看命令列表,请运行 sqlobject-admin help
。每个子命令都有 -h
选项,该选项解释该命令的详细信息。
常用选项¶
许多命令共享一些常用选项,主要用于查找数据库和类。
-c CONNECTION
或 --connection=CONNECTION
这需要一个参数,即数据库的连接字符串。这将覆盖类拥有的任何连接(如果它们硬连线到连接)。
-f FILENAME
或 --config-file=FILENAME
这是一个配置文件,从中获取连接。此配置文件应为定义全局变量database
的 Python 语法文件,该变量是数据库的连接字符串。
-m MODULE
或 --module=MODULE
要查找类的模块。MODULE
类似于myapp.amodule
。如果无法导入模块,请记住设置$PYTHONPATH
。您可以多次提供此参数。
-p PACKAGE
或 --package=PACKAGE
要查找的包。这将在该类及其子类中的所有模块中查找 SQLObject 类。
--class=CLASSMATCH
:
这会将找到的类限制为匹配的类。你可以使用通配符。你可以提供多个--class
参数,如果任何模式匹配,则会包含该类。
--egg=EGG_SPEC
:
这是一个应加载的 Egg 说明。因此,如果你给出--egg=ProjectName
,它将加载该 egg,并在ProjectName.egg-info/sqlobject.txt
中查找一些设置(如db_module
和history_dir
)。
在查找 SQLObject 类时,我们会在模块中查找属于该模块的类——因此,如果你从另一个模块导入一个类,它将不会“匹配”。你必须指明它的原始模块。
如果必须按特定顺序处理类,请创建一个 soClasses
全局变量,其中包含一个类列表。这将覆盖模块限制。这在具有引用完整性的数据库中非常重要,其中从属表不能在它们所依赖的表之前创建。
create
命令¶
这将找到表并创建它们。任何存在的表都将被跳过。
它还从 sqlmeta.createSQL(已添加到 svn trunk)收集数据,并在创建表后运行查询。createSQL 可以是一个包含单个 SQL 命令的字符串、SQL 命令列表或一个字典,其中键是 dbNames,值是单个 SQL 命令字符串或 SQL 命令列表。下面是一个示例
class MyTable(SQLObject):
class sqlmeta:
createSQL = {'postgres': [
"ALTER TABLE my_table ADD CHECK(my_field != '');",
]}
myField = StringCol()
execute
命令¶
这将执行一个任意的 SQL 表达式。如果你想对由 SQLObject 连接字符串描述的数据库运行查询,这将非常有用。如果你想通过管道输入命令,请使用 --stdin
;否则,你可以将命令作为参数给出。
status
命令¶
这显示了数据库中是否存在表。如果可能(取决于数据库),它还将显示与 SQLObject 类描述的表相比,表是否缺少任何列或有任何额外的列。它不检查列类型、索引或约束。此功能可能会在未来添加。
基本用法¶
以下是你如何使用这些命令的快速摘要
- 在你从未使用过
sqlobject-admin
的项目中,运行sqlobject-admin record --output-dir=sqlobject-history
。如果你的活动数据库与代码是最新的,那么该工具将向数据库添加一个sqlobject_db_version
表,其中包含当前版本。 - 现在,对你的代码进行一些更新。不要更新数据库!(你可以,但现在如果你不更新会更有趣。)
- 运行
sqlobject-admin record --edit
。将创建一个新版本,并打开一个编辑器。
record
命令¶
Record 将获取表的 SQL CREATE
语句,并将其输出到新版本中。它使用 ISO 格式的日期(YYYY-MM-DD)和一个后缀来创建版本,以使其唯一。它将每个表放在自己的文件中。
这通常根本不会触及数据库——它只记录代码中定义的模式,而不管数据库如何。事实上,我建议在更新数据库之前调用 record
。