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

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