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_modulehistory_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()

sql 命令

这将显示创建所有表的 SQL。

drop 命令

删除表!将跳过丢失的表。

execute 命令

这将执行一个任意的 SQL 表达式。如果您想对由 SQLObject 连接字符串描述的数据库运行查询,这将非常有用。如果您想通过管道输入命令,请使用 --stdin;否则,您可以将命令作为参数提供。

list 命令

列出找到的所有类。这可以帮助您找出您正在处理哪些类,以及是否有您预期的任何丢失的类。

status 命令

它显示数据库中是否存在表。如果可能(取决于数据库),它还将显示与 SQLObject 类描述的表相比,表中缺少哪些列或具有哪些额外的列。它不检查列类型、索引或约束。此功能可能会在未来添加。

版本控制和升级

有两个与存储架构和升级数据库相关的命令:recordupgrade

其理念是记录架构的每次迭代,并为其获取版本号。类似于 2003-05-04a。如果您使用源代码管理,则会将所有版本签入到您的存储库中;您不会用下一个版本覆盖一个版本。

除了不同架构的磁盘记录之外,数据库本身还包含其所处版本的记录。通过一次拥有所有版本,我们可以从任何版本升级。但稍后会详细介绍 相关内容

基本用法

以下是使用这些命令的快速摘要

  1. 在以前从未使用过 sqlobject-admin 的项目中,运行 sqlobject-admin record --output-dir=sqlobject-history。如果您的活动数据库与代码保持最新,则该工具会将 sqlobject_db_version 表添加到数据库,其中包含当前版本。
  2. 现在,对您的代码进行一些更新。不要更新数据库!(您可以更新,但现在如果不更新会更有趣。)
  3. 运行 sqlobject-admin record --edit。将创建一个新版本,并将打开一个编辑器。

record 命令

Record 将获取表的 SQL CREATE 语句,并在新版本中输出它们。它使用 ISO 格式的日期(YYYY-MM-DD)和一个后缀来创建版本,以使其唯一。它将每个表放入其自己的文件中。

这通常根本不会触及数据库——它只会记录代码中定义的架构,而不管数据库如何。事实上,我建议在更新数据库之前调用 record

upgrade 命令

未来

  • 获取 record 在创建新版本时执行 svn cp,然后覆盖那些文件;这样,版本控制系统将具有良好的差异。
  • 一个选项是 record 一次记录多个数据库后端的 SQL(现在只记录活动后端)。
  • 使用 Python 脚本而非 SQL 命令升级数据库的选项。或者两者兼用。
  • 查看所有冗余信息,可能添加日志记录,查看模拟。
  • 为升级脚本生成简单的 ALTER 语句,以便为人们提供可用的内容。也许。
  • 通过合并升级脚本来修剪版本的命令。
Get SQLObject at SourceForge.net. Fast, secure and Free Open Source software downloads