使用 Python 连接 Apache Derby 数据库
2007-03-30 12:27:00 来源:WEB开发网本文示例源代码或素材下载
有时因为某些原因需要用 Java™ 之外的语言来操纵 Derby 关系数据库。如果您有兴趣使用灵活的解释性语言,如 Python,那么本文就可以帮助您正确设置所有东西。
概述
Apache Derby 是一种用 100% 纯 Java 编写的关系数据库。该项目最初被称作 Cloudscape™,IBM 于 2004 年 8 月将它捐献给了 Apache 基金组织,该项目目前正处在孵化(incubation)阶段。这意味着我们有一种易用的关系数据库可以使用,并且,在拥有 Apache Software License 的情况下,这种关系数据库是完全免费的。
尽管 Derby 是用 Java 编写的,但经常有用其他语言编写的程序需要访问 Derby 数据库。Python 是一种解释性的、高级的、面向对象的、动态类型的程序设计语言。解释器(interpreter)可以交互或迭代使用,这为我们提供了有趣的、快速原型化的语言及进行开发/测试的环境。当与一些现有的实用程序相结合后,我们就拥有了编写高级的、动态的、面向对象的脚本以便极其容易地操纵 Derby 关系数据库所需要的工具。本文将解释并展示如何进行该工作。
本文无意成为 Python、Apache Derby 或 SQL 的介绍性文档。实际上,它将展示如何设置 Windows® 系统,以便可以使用 Python 访问和操纵 Derby 数据库。
第一步
我们需要进行的第一件事情就是在 Windows 系统上安装和配置 Derby。
表 1:安装 Derby
采取的行动 | 描述 | 注释/结果 |
作为绝对的最低要求,我们需要具有Java 运行时环境(Java Runtime Environment,JRE) | 安装来自 developerworks 的 1.4.2 JRE: 从 developerWorks 主页, 选择 Java technology 专区 选择“IBM Developer Kits”链接 选择“download link”链接 选择“ibm-java2-jre-ibm-142.exe”文件链接 阅读下载术语和条件(terms & conditions) 单击“I agree”链接 在磁盘上保存该文件 用病毒检测器进行扫描 执行该安装程序(例如:ibm-java2-jre-ibm-142.exe) | 至少需要有 JRE。另一方面,您也许需要或者拥有一个完整的 Java 开发环境(Java Development Environment),其中包括 Java 编译器和其他实用程序。 |
验证 Java 环境 | 打开一个 new 命令提示符,并输入 java -version | 如果您看到以诸如 java version '1.4.2' 等开头的东西 ,那么该环境就是合适的。否则,您需要重新安装,或者可能需要升级 JRE。 |
安装 Apache Derby | 进入 Apache Derby Project 页面 选择“Downloads”链接 选择“Official Release”下载链接 选择合适的下载(例如:"incubating-derby-10.0.2.1-bin.zip") 对下载的文件执行病毒扫描 解压下载的文件 复制或移动扩展目录结构至 C:Derby | 结果:所有的 Derby 文件都位于: C:Derby |
推荐:安装 IBM Cloudscape | 在 developerWorks 上,进入 Susan Cline 的文章“IBM Cloudscape Version 10.0”。 选择合适的链接,以获得您需要下载的平台版本(例如:“IBM Cloudscape Version 10.0 Windows installer”) 如果还没有一个有效的用户 ID 和密码,就要进行注册 下载安装程序(例如“10.0-IBM-Cloudscape-Win32.exe”) 对下载的文件执行病毒扫描 执行该文件 复制或移动扩展目录结构至 C:Cloudscape | 结果:所有的 Cloudscape 文件都位于: C:Cloudscape |
推荐:安装本文中的示例文件 | 进入下载小节 选择下载文件(例如:Python2DerbySamples.zip) 在您的系统上保存该文件 用病毒检测器进行扫描 展开该文件的内容 复制或移动 *.bat 文件至 C:Derbyin | 结果:所有的示例文件都位于: C:Derbyin |
为什么同时安装 IBM Cloudscape 和 Apache Derby?
据我所知,安装 Derby 的主要原因是:您可以访问程序源文件,并参与检查和实现开放源代码项目(Open Source Project)。从 IBM 获得的 Cloudscape 的“当前”版本与从 Apache 获得的 Derby 的绝对“最新”版本之间很可能存在一些差别。这里可能没有太大区别。而有时,则存在很大区别。因此,您可以决定是否安装 Derby ,或者 Cloudscape,或者都安装。
安装 IBM Cloudscape 有许多原因。我发现最重要的是,IBM Cloudscape 包括:
PDF 格式的文档(更易于搜索)
示例程序
示例数据库
必要的“IBM DB2 JDBC Universal Driver”(例如:db2jcc*.jar)jar 文件。
用于执行各个实用程序的命令文件,例如:
dblook | 数据定义语言(Data Definition Language,DDL)生成实用程序(也称作模式转储工具) |
ij | 用于在数据库上运行脚本的交互式 JDBC 脚本工具 |
sysinfo | 提供关于 Cloudscape 版本和系统的信息的实用程序 |
*NetworkServer*.bat | 用来启动和停止作为网络服务器的 Cloudscape 的命令文件 |
Derby 目录结构和内容:
安装 Derby 之后,其目录结构以及所包含的内容应如下:
目录 | 内容 |
C:Derby | Derby 安装产生的 COPYRIGHT、LICENSE、NOTICE 和 README 等文件,以及下列目录: |
C:Derbyin | 来自 Python2DerbySamples.zip 或 C:CloudscapeframeworksNetworkServerin 的所有 *.bat 文件 |
C:Derbydatabases | C:Cloudscapedemodatabases 中的所有数据库数据(例如:示例和 toursDB 目录) |
C:Derbyjavadoc | Derby 安装产生的所有 Java 文档 |
C:Derbylib | Derby 安装产生的所有 *.jar 文件 |
启动 Derby Network Server
为了获得关于配置和使用 Derby Network Server 的后台信息,您最好考虑看一看 Derby 文档。对于像我一样对快速完成事情感兴趣的人来说,可以以 Cloudscape 脚本文件为例,编写自己的、启动和停止 Derby 数据库的简单 Derby Server 脚本。
为了使事情更加容易,我在示例下载文件中包含了下列所有脚本文件。
表 2:Python2DerbySamples.zip 的内容
文件名 | 描述 |
setNetworkClientCP.bat | 用来为 Derby 客户机指派 CLASSPATH 环境值 |
setNetworkServerCP.bat | 用来为 Derby 服务器指派 CLASSPATH 环境值 |
NetworkServerControl.bat | 用来向 Derby Network Server 程序发出命令 |
startNetworkServer.bat | 用来启动 Derby Network Server 程序 |
stopNetworkServer.bat | 用来停止 Derby Network Server 程序 |
dblook.bat | 数据定义语言(Data Definition Language)生成实用程序 |
ij.bat | 交互式 JDBC 脚本编制工具 |
sysinfo.bat | 用于显示 Derby Network Server 系统的有关信息 |
有三种方式启动 Derby Network Server 程序:
手动方式(例如:设置 CLASSPATH 环境变量,并用 start 参数调用 java 以执行 NetworkServerControl 类文件)。例如:
set CLASSPATH=C:Derbylibderby.jar;C:Derbylibderbytools.jar;C:Derbylibderbynet.jar |
使用 NetworkServerControl.bat 文件,并指定“start”为作为参数。例如:
NetworkServerControl start |
使用 startNetworkServer.bat 文件。请注意,因为所有的事情都是通过脚本完成的,所以您很容易在桌面上或快速启动工具栏内获得到该脚本的快捷方式。因此,您既可以使用快捷图标,也可以从命令提示符启动该脚本。例如:
startNetworkServer |
似乎在编程人员中普遍存在的一个特点就是习惯寻找、编写以及使用“快速且容易”的方式来做事。在某种意义上,这也正是本文的基本内容。由于 Windows 批处理(*.bat)文件是一种脚本形式,所以不难理解为何人们愿意通过一个脚本文件指定并处理所有的“细节”。它不仅易于使用,而且还易于记忆。
清单 1:setNetworkServerCP.bat
该脚本文件被其他脚本文件调用,以在 CLASSPATH 环境变量前面添加合适的 Derby Java Archive(jar)文件。因此,文件名是:(例如:Set Network Server ClassPath):
set DERBY=C:Derby |
清单 2:NetworkServerControl.bat
该脚本文件执行 setNetworkServerContol 程序,并传递所有用户指定的参数。这就允许我们有一个公共脚本文件,这个文件可用来发出任何支持的 Network Control 命令:
@ECHO OFF |
清单 3:startNetworkServer.bat
这个专门的脚本文件只能用于启动 Derby Network Server。与前面的脚本文件十分相似,调用 NetworkServerControl 程序,指定“start”作为惟一参数:
@ECHO OFF |
不管用以启动作为 Network Server 的 Derby 的技术是什么,如果可以启动成功,那么该程序就会等待来自客户机的连接请求。在收到每个连接时,将显示一条指示收到连接的消息。
停止 Derby Network Server
有三种(合理的)停止 Derby Network Server 程序的方式:
手动方式(例如:设置 CLASSPATH 环境变量,并用 shutdown 参数调用 java 以执行 NetworkServerControl 类文件)。例如:
set CLASSPATH=C:Derbylibderby.jar;C:Derbylibderbytools.jar;C:Derbylibderbynet.jar |
使用 NetworkServerControl.bat 文件,并指定“shutdown”为作为参数。例如:
NetworkServerControl shutdown |
使用 stopNetworkServer.bat 文件。与 startNetworkServer.bat 一样,您可以在桌面上或快速启动工具栏内获得到它的快捷方式。因此,您既可以使用快捷图标,也可以从命令提示符运行该脚本。例如:
stopNetworkServer |
注意:即使可以异常终止 Derby Network Server 程序或进程窗口,这样做也可能会破坏数据库,因此,应该严格禁止这样做。
查找关于可以被 NetworkServerControl 程序执行的动作的信息的一种方法就是查看 Derby 文档。另一种方法就是执行它,且不指定任何参数。这样做将使之显示使用信息。正如在 图 1 中可看到的,用来请求停止 Derby Network Server 的参数是“shutdown”。
当我们为脚本指定一个它不认识且不支持的参数时,我们就会认识到基于被调用的 Java 类(例如:NetworkServerControl)的名称来命名批处理(.bat)文件的一个好处。该 Java 类显示一些“使用”信息 ,包括所调用的 Java 类的名称。
图 1:NetworkServerControl - 使用信息
C:Derbyin> NetworkServerControl |
连接到 Derby Network Server
在 图 1 中可以看到,利用 NetworkServerControl 不仅可以启动 Derby Network server,还可以演示可以进行连接(例如:通过“ping”请求)。Derby 客户机需要使用的接口与 NetworkServerControl 程序使用的不同。为客户机提供的接口是一个 Java 数据库连接(Java Database Connectivity,JDBC)接口。在客户机可以使用该 JDBC 接口连接到 Derby Network Server 之前,我们需要获得一个支持该接口的连接驱动程序。
这种支持是由两个 jar 文件提供的:
db2jcc.jar
db2jcc_license_c.jar
幸运的是,我们有两个地方可以获得这些文件。
我们可以从 developerWorks 检索它们:
访问 Susan Cline 的 IBM DB2 JDBC Universal Driver, for Apache Derby Network Server 一文
选择“db2jcc_for_derby.zip”链接
选择“Released product: IBM Cloudscape (IBM DB2 JDBC Universal Driver, for Cloudscape/Derby)”链接
单击 Continue 按钮
如果需要,要进行注册
单击 Sign-in 按钮
填入您的用户 ID 和密码,然后单击 Submit 按钮
阅读许可证协议,然后单击 I agree 按钮
将 db2jcc_for_derby.zip 下载到计算机中
对下载的文件运行病毒扫描
提取文件内容
或者,如果安装了 Cloudscape,就只需复制 C:Cloudscapelib 目录中的文件。
无论是哪种情况,都需要将文件(db2jcc.jar 和 db2jcc_license_c.jar)复制到 C:Derbylib 目录。
安装 Cloudscape 的一个好处就是它包含了所有的必需文件,以及说明在批处理(*.bat)文件中如何使用这些必需文件的文档。
对于那些感到惊讶的人来说,文件名中的 JCC 代表 Java Common Client。
实际上,图 2 中使用的 lsPath 命令是一个 Python 程序,这在我的 Jython 文章中有过讨论。
图 2:更新后的 CLASSPATH
C:Derby> lsPath classpath |
使用 ij 实用程序
现在,我们可以使用随 Derby 提供的其他实用程序——特别是 ij 实用程序——来做更多的事情,而不只是连接到 Derby Network Server。为了了解如何运行 ij 实用程序,我们可以再次利用随 Cloudscape 提供的脚本。除了查看和研究 ij 脚本,我还将示例数据库从 C:Cloudscapedemodatabases 复制到了 C:Derby 下的相应位置上。例如:
图 3:复制 Cloudscape 示例数据库
C:> xcopy C:Cloudscapedemodatabases C:Derbydatabases /s /e |
如果我们使用主机名 localhost 启动 Derby Network Server,就不需要验证密码,这是最容易的方法。这意味着该用户 ID 将只用来定义连接的初始模式。由于只能从同一台计算机建立到数据库的连接,所以不应有过多的安全性暴露和担心。一旦稳定了环境,您就可以使用 Derby 文档来启用密码验证和来自远程计算机的连接。
该模式能识别数据库中将通过默认方式访问的表。这样我们便可以使用 "SELECT * FROM ORG",而不是使用 "SELECT * FROM SAMP.ORG"。
因为我们通过 Network Server 访问 Derby 数据库,所以在建立连接之前必须启动 Network Server 。
图4:ij 会话
C:Derbyin> ij |
DB2 Runtime Client
众所周知的是,Derby 所提供的 JDBC API 对于 Java 程序是最有用的。如果您想要或者需要使用 JDBC 应用程序编程接口(Application Programming Interface,API)连接 Derby,那么您应该考虑使用 Jython,而不是 Python。
幸好,还有另一种可选方案。Susan Cline 在 developerWorks 发表了一篇题为“Cloudscape and ODBC”的文章。描述了如何通过 JDBC 接口使用 DB2 Runtime Client 来连接 Derby Network Server,并向支持它的其他程序提供开放式数据库连通性(Open DataBase Connectivity,ODBC)接口。ODBC 是一种开放式数据库访问方法,其中定义了程序可以并应该如何访问和/或操纵数据库中的信息。
Susan 的文章“Cloudscape 和 ODBC”包含了“Windows downloads”小节。通过“DB2 Run-Time Client Lite, Version 8.2”链接,访问第 3 部分中检索和安装客户机代码的有关指导。因为已经安装了 Derby,从 Cloudscape 复制了示例数据库,并利用 ij 实用程序验证了 JDBC 到 Derby Network Server 的连接,所以我们现在已经准备好要配置 DB2 Runtime Client了。
表 2:设置 DB2 Runtime Client
步骤 | 采取的行动 | |
1. | 如果还没有运行 Derby Network Server,就遵照上面启动服务器中的指导,使之启动。 | |
2. | 启动 DB2 命令行处理器(Command Line Processor,CLP)。 您可以使用 Windows Start 菜单: Start -> Programs -> IBM DB2 -> Command Line Tools -> Command Line Processor 您也可以打开命令提示符 切换到运行时客户机安装下的 bin 目录。例如: cd C:Program FilesIBMSQLLIBin 使用下述命令初始化 DB2 环境: db2cmd 使用下述命令执行 DB2 CLP: db2 | |
3. | 配置一个名称,通过它DB2 代码可以访问 Derby Network Server。出于简单性原因,我们将使用 derby。请注意,这不是一个主机名,而仅仅是 DB2 配置中用来识别如何连接到 Derby Network Server 的一个名称。
| |
4. | 配置看作是在“远程”节点上的示例数据库:
| |
5. | 虽然 toursDB 数据库就在本地计算机上,但还是让我们将其看作是在相同的“远程”节点上来配置它:
| |
6. | 现在,我们可以验证到该数据库的连接了。
| |
7. | 同样,执行与在 图 4 中使用 ij 执行的相同的查询。
| |
8. | 完成之后,应该断开与数据库的连接。
| |
9. | 并退出命令行处理器。
| |
10. | 如果该窗口仍然打开着,而我们需要关闭它,那么只需执行:
|
如果您选择 User DSN,那么您所定义的信息就只对执行该配置的用户可用。另一方面,如果您使用 System DSN,那么 Data Source Name 就是一个对该系统上的所有用户都可用的、系统范围的值。
配置 ODBC
为了访问刚刚所定义的 DB2 配置,还需要进行一些附加的 ODBC 配置。打开 Windows Control Panel:
使用:
Start ->
Settings ->
Control Panel
或:
Start ->
Control Panel
选择 Administrative Tools
并启动 ODBC Data Source Administrator:
在 User DSN 选项卡中,单击 Add 按钮
向下滚动,并选择 IBM DB2 ODBC DRIVER:
单击 Finish 按钮
在 IBM DB2 ODBC DRIVER - Add 对话框上:
指定 sample 的 Data source name(DSN)
在 Database alias 下拉菜单中,选择 SAMPLE
可选地指定 Description
单击 OK 按钮
您也可以使用相同的这些步骤来定义 toursDB 数据库的数据源名(当然要使用合适的数据库别名)。
单击 OK 按钮
安装 Python
您可能想知道:要过多长时间才能开始安装 Python...。现在就可以了。
表 3:安装 Python
采取的行动 | 描述 | 注释/结果 |
获得并安装 Windows 版本的 Python 的最容易的方法就是利用 ActiveState 站点 | 为了检索并安装 Python,要: 在 ActivePython 页面上, 选择 Download 可选地填入有关信息,并单击 Next 按钮 使用 Windows MSI 链接来保存可执行的安装文件 用病毒检测器进行扫描 通过 Windows Explorer,双击安装程序(例如:ActivePython-2.4.1-245-win32-ix86.msi) | 将 Python 安装到适当的位置,例如,C:Python24 |
验证 Python 安装 | 打开 new 命令提示符,并输入 python -V | 您可以看到 Python 2.4.1 |
一些附加工作
既然已经安装了 Python,那么我们就可以用它来编写一些有趣且十分有用的脚本了。我发现自己在 Unix™ 上总在使用的一条命令就是 which 命令。对于那些不熟悉该命令的人来说,它用来识别输入命令后将要执行的程序。
例如:which java 将显示到该 java 可执行程序的完整路径。
遗憾的是,which 命令在 Windows 上不可用。我们可以在 Internet 上搜索它,也许可以立即获得该实用程序的即时可用的大量实现。或者,我们可以看一看在 Python 上实现它需要什么。
这里是该程序的一个未注释版本,基于 Python 安装所提供的。在下面的下载小节中可以获得注释版本。
它如何工作
它是用 PATH 和 PATHEXT 环境变量的值来搜索具有指定文件名的文件,该文件名存在于 %PATH% 中的一个目录中,以 %PATHEXT% 中所指定的一种可执行扩展名结尾。如果找到一个,就会显示到这个可执行程序的完整路径。
C:> type C:Python24which.py |
缺失的一环
到此,我们“几乎”获得了通过 Python 脚本访问 Derby 数据库所需的所有东西。最后需要的就是提供使用 ODBC 接口的数据库支持的 Python 模块。Python Web 站点上的主题小节包含了利用 Python 访问数据库的有关信息。该页面上的 Database Modules 链接包括所缺失的这一环(双关语)。mxODBC 包是“...几乎 100% 的到可以通过 ODBC API 访问的数据库的 Python DB API 兼容接口”。
安装 mxODBC 包
在 eGenix.com mx Extensions for Python 页面上,选择到 Base Package 的 Download 链接
选择 Windows installer, Python 2.4 链接
并保存下载文件(例如:egenix-mx-base-2.0.6.win32-py2.4.exe)
使用浏览器的后退箭头,并选择 Commercial Package 的 Download 链接
选择 Windows installer, Python 2.4 链接
并保存下载文件(例如:egenix-mx-commercial-2.0.7.win32-py2.4.exe)
对下载的文件进行病毒扫描
在扫描成功之后,执行每个安装器程序。
在某些系统上,特别是 Windows 2000 系统,在安装 mxODBC 包时,您可能会看到一条警告信息,告诉您 MDAC SDK 软件需要更新。如果是这样,您可以使用下列过程从 Microsoft® 安装最新的代码版本。
访问 Microsoft ODBC 页面。
选择 Downloads
选择 MDAC 2.8 链接
单击 Continue 按钮
可选地,验证您的系统,并单击 Continue 按钮
单击 Download 按钮
保存安装可执行文件(例如:MDAC_TYP.exe)到您的计算机
对安装程序运行病毒扫描
在扫描成功之后,执行该安装程序。
阅读许可证协议,选择“I accept...”,并单击 Next 按钮
单击 Finish 按钮开始安装
安装完之后,重启计算机
使用 Python 交互式地连接到 Derby
让我们用 Python 解释器来做我们刚才用 ij 实用程序和 DB2 CLP 所做的事情。这将向您展示使用 Python 来连接 Derby 数据库是多么容易。请记住首先启动网络服务器,否则,您可能收到出错信息。
表 4:连接关键字参数
但是,首先,您需要知道一些连接请求中所使用的参数:
DSN | 数据源名(Data Source Name),正如在前面 配置 ODBC 部分所看到的,该值识别 ODBC 连接请求将如何与 DB2 驱动程序相关联,后者反过来将在“远程”节点上用 Derby Network Server 关联它。 |
UID | 有效的用户 ID。该值将发送给 ODBC 驱动程序,后者将基于 DB2 运行时客户机配置,将其发送给 Derby Network Server,以进行身份验证。因为我们没有在 Derby 中启用用户身份验证,所以这将只用于识别要使用的初始 SCHEMA。 |
PWD | 指定的用户 ID 的密码。 |
图 5:Python 会话
C:> python |
这正是我们想要的结果。
结束语
在本文中,我们看到通过一些配置,就可以设置一个允许我们访问 Apache Derby 这个易于使用的、开放源代码的关系数据库的Windows 环境。此外,我们可以在允许连接到 Derby 并对其进行操纵的 Python 中开发高级的、动态的、面向对象的程序。
更多精彩
赞助商链接