使用 Rekall 轻松进行数据库开发

作者:Joshua Bentham

在未来几年,跨平台编程的问题将变得越来越重要,因为公司——尤其是中小型企业——看到了迁移到 Linux 的优势,并采取明智的方式,一次迁移几台机器。对于那些有能力且足够聪明的顾问来说,能够快速开发可在客户拥有的多个平台上运行的垂直市场应用程序将成为一种竞争优势。借助 Rekall 和 PostgreSQL,这种能力现在即可实现。

去年,我的业主协会找到我,想让我替换一个旧的 Microsoft Access 应用程序。过去,我曾使用各种工具包完成过类似的任务,例如 Glade、C++ 和 Sybase ASE 的组合,后来又使用了 Apache、PHP 和 PostgreSQL。这次我面临着许多限制:该软件必须在 Microsoft Windows 和 Linux 下都能工作;该软件必须有一个本地胖客户端;并且该软件必须生成报表。

数据库后端是毋庸置疑的;我使用了 PostgreSQL。在 Linux 和 Windows 下都能访问 PostgreSQL 8 版本,这不仅证明了优秀自由软件的力量,也为开发健壮且可扩展的跨平台应用程序提供了极其肥沃的土壤。有了合适的前端,您的服务器是 Linux 还是 Windows,或者您的桌面中有多少是 Linux 或 Windows 都无关紧要。这对于正在考虑为部分或全部员工切换到 Linux 桌面的公司来说非常棒。

对于前端,我想要一个开发环境,该环境允许我快速设计表单、报表以及它们连接的数据库。跨平台操作是必须的,因为协会对为部分员工迁移到 Linux 感兴趣,同时在那些使用专有 Windows 专用应用程序的员工的桌面上保留 Windows。

在搜索过程中,我遇到了几种声称自己像 Microsoft Access 一样,甚至更好的工具。所有这些工具都允许访问多个数据库以及 ODBC 数据源,并且可以使用某种形式的 BASIC、JavaScript 或 Python 进行脚本编写。这些工具包括 Kexi、OpenOffice.org Base、Kylix、Knoda、Rekall 和 Glom。

在这些产品中,只有 Kylix 和 Rekall 声称自己已准备好投入生产。因此,我进一步研究了它们。在发现 Kylix 没有内置支持生成报表的功能后,我将研究重点放在了 Rekall 上。

Rekall 揭秘

Rekall 由英国公司 Series One Consulting 开发。Series One 的首席顾问 Mike Richardson 于 2001 年开始编写 Rekall,原因是他对 Linux 下缺乏数据库开发工具感到沮丧。John Dean 加入了 Mike 的行列,他负责 Windows 和 Macintosh 的开发,并编写了 Oracle 和 DB2 的驱动程序。

Rekall 最初由 TheKompany 作为其跨平台开发应用程序之一进行商业分发。在 2003 年末,分发合同结束,Series One 决定自行分发 Rekall。如果您决定查看 Rekall,请务必从 TotalRekall 或 RekallRevealed 网站获取,因为这些是积极维护的版本。

Rekall 在两种许可下可用:GPL 和专有许可。这部分是由于它使用 Qt 构建,并且在首次开发时,TrollTech 没有在 GPL 下提供 Windows 版本的 Qt。因此,您可以从 RekallRevealed 网站下载 Linux 版本的 Rekall 源代码并自行编译。或者,您可以支付 25 英镑(约 45 美元)下载 Linux、Windows 和 Macintosh 二进制安装包。此外,Series One 还以额外费用提供 ODBC、Oracle 和 DB2 的数据库驱动程序以及运行时包。

Rekall 的下一个版本 2.4 计划以几个不同的版本交付。GPL 版本将始终以源代码形式提供。此外,Series One 计划提供一个专业版,其中包含两个附加功能

  • 加密允许您分发应用程序,而无需担心有人复制您的源代码。Rekall 专业版提供的加密功能将允许您分发您的应用程序,并在每个客户端的基础上对其进行保护。

  • Web 应用程序创建允许您将任何 Rekall 应用程序转换为基于 LAMP 的 Web 应用程序。这可以在 RekallRevealed 网站上看到。

Rekall 的缺点

在我的应用程序中,我只发现使用 Rekall 有几个缺点。首先,没有直接创建菜单栏的方法。其次,Rekall 生成的应用程序未加密。

在 Rekall 应用程序中,有一个标准的菜单栏和工具栏,其中包含允许最终用户执行查询和完成其他任务的命令。它功能相当齐全,因此如果您想限制用户可以执行的操作,则必须完全关闭菜单和工具栏。如果您不介意手动编辑 XML 文件,则有一种方法可以限制显示哪些按钮和菜单,甚至创建自己的按钮和菜单。但是,这不是受支持的用法,因此如果作者将其包含在下一个版本中,将会很有帮助。

所有代码以及描述应用程序表单的 XML 都以文本形式存储在文件系统或数据库中。如果您正在开发一个潜在的利润丰厚的应用程序,最好等到加密和 Web 应用程序创建完成后再进行。或者,研究 FreeNX 等技术,这些技术允许您将应用程序作为服务交付。购买运行时库以随应用程序一起分发将允许您限制最终用户可以执行的操作,因为运行时库不包含开发工具。但是,这样做并不能阻止精明的用户下载完整版本的 Rekall 并从您的应用程序中获取代码以供自己使用,或者编辑这些文件以添加自己的功能。当 Rekall 专业版发布后,您将能够使用私钥加密在每个客户端的基础上对您的应用程序进行加密。

当然,将所有内容都放在纯文本 XML 中也是一个救命稻草。最近,我意识到我有一系列组件组(也称为块)配置错误。我没有必要在每个块中剪切和粘贴或重新布局 11 个字段,而是简单地修改了定义块的 XML,使其指向表而不是查询,并且它完美地工作了。

获取 Rekall

在 Linux 版本的 Rekall 上开发了一段时间后,我下载了源代码,并在我购买的 Windows 安装版本上测试了我的应用程序。我的应用程序在两种环境中看起来完全相同。事实上,移植到 Windows 非常轻松:我只需在我的 Linux 机器上备份 PostgreSQL 数据库,并将该文件以及 Rekall 项目文件复制到 Windows 机器即可。在那里,我将备份文件恢复到 Windows 版本的 PostgreSQL 8.0.2,并在 Windows 版本的 Rekall 中运行了项目文件。

Windows 安装包大小适中,约为 7MB。但是,您必须小心,在安装 Rekall 之前安装正确版本的 Python。对于当前版本 Rekall 2.2.3,您需要 2.3 系列中的任何 Python 版本。

在 Linux 下编译非常简单。在 CentOS 3 下,编译没有产生任何错误,并且安装干净。升级到 CentOS 4 后,我在安装过程中收到了编译错误,但应用程序确实安装干净了。在配备 512MB 内存的相对较旧的 900MHz Athlon CPU 上,编译过程大约需要一个小时。

首次运行 Rekall 时,它会显示一系列对话框,用于配置开发环境的某些行为。这些行为包括记录更新和删除的验证以及开发环境的布局。首次发生这种情况后,除非用户的 Rekall 配置文件被删除,否则不会再次发生。

示例应用程序

为了演示 Rekall 中开发的简易性,我构建了一个小型应用程序,用于跟踪哲学家及其著作。此示例很好地展示了 Rekall 的开发简易性和 Python 脚本编写功能。最终目标是类似于图 1 中看到的应用程序——一个带有两个选项卡的小型数据输入窗口、一个报表以及底部描述当前哲学家状态栏。

Easy Database Development Using Rekall

图 1. 已完成的哲学家应用程序

在开始之前,您需要配置 PostgreSQL 以便与 Rekall 良好配合使用。配置 PostgreSQL 以支持来自本地应用程序的连接,如“配置 PostgreSQL”侧边栏所示。完成此操作后,添加一个用户 philosophy_major 并设置密码,然后创建 philosophers 数据库。所有这些都必须在 Rekall 首次连接之前完成,因为 Rekall 不具备添加用户或数据库的功能。重新加载 PostgreSQL 服务器后,它就可以连接了。

现在,我们需要创建项目。打开终端窗口并为项目创建一个目录。然后,通过键入以下命令启动 Rekallrekall在命令行中。安装后,rekall 可执行文件应位于 /usr/bin 目录下。

启动项目非常简单。单击“新建”按钮后,您将看到项目创建向导。在第一个屏幕上,您输入应存储信息的目录,以及项目的名称(数据库名称)。在下一个对话窗口中,告诉它在哪里存储表单、报表和其他 XML 结构。这些项目可以存储在数据库中、特殊的 Rekall 对象表中或文件系统中的文件中。选择该选项后,选择您正在使用的数据库平台。您可以有多个数据源,每个数据源运行不同的驱动程序。此特定对话框控制主数据库。

接下来的两个对话框允许您输入数据库主机和端口以及您要用于连接的用户名/密码对。然后,在成功连接后,您指定要使用的数据库。

选择数据库后,将出现类似于图 2 所示的屏幕。现在您可以开始构建您的应用程序了。应用程序构建的第一步是创建表。为此,请单击“对象”树中的“表”项。然后,选择正确的服务器并双击“创建新表”。然后会出现表构建器,如图 3 所示。

Easy Database Development Using Rekall

图 2. 从主项目窗口中,您可以向下钻取以设置表并创建表单和报表。

Easy Database Development Using Rekall

图 3. 使用“表”窗口创建新表。

Rekall 无法使用已存在的表。编写一个实用程序将数据库模式转换为 Rekall 定义文件将是一个有趣的练习。右键单击“表”树中列出的项目名称会显示一个菜单,该菜单允许您导入表定义,该定义包含在可以从 SQL 表定义构建的 XML 文件中。

接下来,是时候从您创建的数据库模式构建一些表单了。幸运的是,Rekall 提供了一些简单的工具来完成此操作。当您单击“对象”树中的“表单”项并展开以您的项目命名的项时,您可以创建表单或使用向导创建表单。即使在创建使用选项卡式页面等复杂应用程序时,首先将每个页面创建为单独的表单,复制这些对象,然后将它们粘贴到表单上的相应块中也很有帮助。

在图 4 中,您可以看到我如何使用向导基于 philosophers 表创建表单。即使您使用向导,您也可以对表单进行大量控制。它不仅会询问您要使用的表和字段,您还可以指定每页多个记录、字段格式以及应自动添加到页面的工具。在图 4 中的表单中,向导添加了您在屏幕底部看到的按钮,以及最底部的小型导航工具。此小部件称为导航工具,允许您逐条记录地浏览数据库。

Easy Database Development Using Rekall

图 4. 表单向导为您完成大部分工作,但您在设计表单时具有很大的灵活性。

在为 Philosophers 及其 Publications 创建表单后(如图 5 所示),我需要将它们组合到一个窗口中。这是手动创建表单有利的地方,这样我就可以随意添加组件。但是,在执行此操作之前,我们需要检查块的概念。

Easy Database Development Using Rekall

图 5. 出版物表单将成为笔记本窗口的一部分,主 Philosopher 表单如图 4 所示。

在 Rekall 表单中,数据以称为块的实体表示。有几种类型的块,最简单的是表块。其他类型的块包括查询块和 SQL 块,它们显示从查询检索的数据。一个表单可以有任意数量的块。这些块可以并排存在,也可以在同一可视化平面上的任何配置中存在。或者,它们可以通过选项卡式页面控件作为笔记本中的页面存在。这就是我利用来实现我的单窗口目标的方式。

为了创建我的笔记本,我创建了一个新表单,而没有使用向导。选择该命令后,我将获得如图 6 所示的“表单属性”窗口。如您所见,我已经配置了一个基本窗口。它不可拉伸,没有状态栏,并且顶层块类型为空——在选择对话框中称为菜单块。将顶层块类型设置为仅菜单或空允许我们将块和控件任意放置在表单上。

Easy Database Development Using Rekall

图 6. 使用空顶层块创建 Rekall 表单

在通过单击每个属性、进行选择并按下对话框底部的“接受”按钮来浏览每个属性之后,我将看到一个“块属性”窗口,该窗口非常类似于“表单属性”页面。因为这只是一个菜单块,所以我可以安全地接受许多默认值,因为大多数值仅适用于表块或查询块。该操作为我提供了一个空白页面,我可以适当地调整其大小并添加选项卡控件。

在选项卡控件的每个页面上,我只需创建一个与正确表对应的表块。然后,我将 Philosophers 表单中包含的块的所有内容复制到 Philosophers 选项卡页面中的相应块,并对 Publications 页面重复该操作。完成此操作后,我使用正确的名称修饰字段,修改 Publications 页面上 Abstract 字段的大小,我的笔记本就完成了。

现在,我需要找到一种方法,让 Philosopher 页面设置用于查找出版物的键。我通过使用主表单底部、选项卡页面控件下方的状态标签来完成此操作。每当执行数据库查找或创建新条目时,都会设置此标签的文本值。当列表 1 中显示的代码通过 Philosophers 块的“显示时”事件设置的回调运行时,将设置该标签。当显示 Publications 块时,将为该块调用“显示时”事件,该事件在该块中显示的数据上设置用户过滤器。用户过滤器代码可以在列表 2 中看到。

列表 1. Philosophers 块的“显示时”函数

def eventFunc (block, row) :
    someMainForm = block.getForm();
    currBlock = block;
    dataLabel = someMainForm.getNamedCtrl("current_philosopher");
    dataLabel.setText(currBlock.getNamedCtrl("last_name").getValue());

列表 2. Publications 块的“显示时”函数

def eventFunc (block, row) :
    mainForm = block.getForm();
    currBlock = block;
    dataLabel = mainForm.getNamedCtrl("current_philosopher");
    currBlock.setUserFilter(dataLabel.getValue());

最后,我需要某种方法来列出数据库中拥有的哲学家。图 7 显示了 Rekall 的报表功能。

Easy Database Development Using Rekall

图 7. 报表设计窗口可以像设计表单一样轻松地构建报表布局。

Rekall 还提供了许多其他组件,例如报表、查询和数据复制器。每个组件都可以轻松创建,并提供与表单相同的多功能性。

结论

正如我已经证明的那样,Rekall 和 PostgreSQL 提供了在 Linux 下快速完成各种数据库编程任务的能力,同时提供了许多顾问需要的跨平台功能。随着公司迁移到 Linux 桌面,Rekall 等产品将迎来更大的需求。

配置 PostgreSQL

按照默认安装配置后,PostgreSQL 8.0.2 通过检查其 Linux 身份验证其用户。要创建更安全的应用程序,您应将其更改为密码身份验证。以下步骤描述了如何执行此操作。

首先,修改数据库用户 postgres 的密码,以便在需要密码时可以登录

  1. 在命令提示符下,键入su并输入您的 root 密码。

  2. 然后,键入su postgres.

  3. 现在,通过键入以下命令启动 psql 监视器psql template1.

  4. 我们通过键入以下命令来修改密码alter user postgres with password 'pgUser89'或一些其他合适的密码。

  5. 通过键入以下命令退出监视器\q并按 Enter 键。

其次,修改 pg_hba.conf 文件,以便数据库接受所有连接的 md5 密码。默认情况下,它配置为基于当前 Linux 帐户的身份进行身份验证。在默认安装中,此文件位于 /var/lib/pgsql/data 下。此文件包含如下行

# "local" is for Unix domain socket connections only
local   all    all                         trust
# IPv4 local connections:
host    all    all   127.0.0.1/32          md5
# IPv6 local connections:
host    all    all   ::1/128               md5

要启用密码,请更改trust本地行的选项为md5并保存文件。然后,重新启动 PostgreSQL。在类似 Red Hat 的系统上,可以通过发出以下命令来完成此操作/sbin/service postgresql reload.

完成此操作后,可以使用 PostgreSQL 的内置工具或使用 PgAdminIII 等第三方工具来创建用户和数据库。PostgreSQL 网站始终是获取有关这些主题的更多信息的最佳资源。

本文资源: /article/8271

Joshua Bentham 即将从俄亥俄州贝克斯利的首都大学毕业,获得哲学学士学位。自内核版本 1.2.8 以来,他一直使用 Linux。他的博客可以在 www.globalherald.net/jb 上找到,您可以通过 jb42@globalherald.net 与他联系。

加载 Disqus 评论