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
这是一个配置文件,用于获取连接。此配置文件应为 Python 语法文件,其中定义了一个全局变量database
,它是数据库的连接字符串。
-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 主干中)收集数据,并在创建表后运行查询。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
。