MySQL数据库技术(26)
MySQL 客户机这种有限的特性并不是缺点,而是特意设计的。程序是具有通用目的的实用程序;它们并不试图预料您所想做的所有可能的需要。MySQL 的开发者们不赞成编写大型的、臃肿的程序来试图做可能想去做的每件事情(而且这样做的结果将使程序中包括大量的
您根本不关心的事情的代码)。然而,有时有些应用确实有常规客户机的能力所无法处理的需求。为了处理这些情况,MySQL 提供一个客户机编程库。这允许您编写自己的程序,满足您的应用程序可能具有的任何特定需求。通过允许您对MySQL 服务器的访问,客户机的开放
程度只受您自己想象力的限制了。
编写自己的程序可以获取如何特殊的能力呢?让我们比较一下mysql 客户机和其没有附加代码的接口对MySQL 服务器的访问:
■ 可以定制输入处理。用mysql可以输入原始的SQL 语句。用自己的程序,可以为用户提供使用起来更直观、更容易的输入方法。用程序可使用户不必知道S Q L—甚至不必知道在完成的任务中数据库承担的角色。
输入信息的采集可能是像命令行风格的提示和值读取这样基本的方式,或者可能是使用屏幕管理程序包(如curses 或S - L a n g)、使用Tcl/Tk 的X 窗口或Web 浏览器格式实现的基于屏幕输入那样复杂的方式。
对大多数人来说,通过填写一定的格式来指定搜索参数的形式比通过发布SELECT语句更容易。例如,一位房地产经纪人,要寻找一定价格范围、风格或位置的房屋,只要将查寻参数输入到表格中,就可以最小的代价得到符合条件的内容。输入新记录或更新已有记录也类似地考虑这种应用。在数据输入部门的键盘操作员应该不需要知道像INSERT、REPLACE 或UPDATE 这样的SQL 语法。
在最终用户和MySQL 服务器之间提出输入采集层的另一个原因是可以校验用户提供的输入。例如,可以检查数据,确认它们是符合MySQL 要求的格式,或可以要求填写特定的区域。
■ 可以定制输出。mysql 的输出基本上是无格式的;可以选择以制表符为分隔符或以表格形式输出。如果想要使输出结果看起来比较好,则必须自己对它进行格式化。这些需求可能像打印“Missing”而不是NULL 这样简单,也可能更复杂。考虑下面的报告:
这个报告包括几个特定的元素:
■ 定制标题。
■ 在State 列中重复值的抑制以便只在更改时才将这些值打印出来。
■ 小计和总计的计算。
■ 数字格式,如9 4 3 8 4 . 2 4,打印为美元数量为$ 9 4 , 3 8 4 . 2 4。对于一些任务,甚至可能不需要任何输出。您可能正在对计算向后插入到另一个数据库表中的结果进行简单地检索信息。除了用户运行这个查询以外,甚至可能还想将这个结果输出到其他地方。例如,如果正在提取姓名和电子邮件地址以自动地填入为批量电子邮件生成信件格式的过程中,则程序产生输出。但是该输出由邮件接受者的信息组成,而没有运行程序人员的信息。
■ 可以在S Q L自身施加的约束条件的环境下工作。SQL 不是一种带有条件选择、循环和子例程的流程控制结构的过程语言。SQL 脚本包括一组从开始到结束一次一个的可执行语句,具有最低限度的错误检查。
如果在批处理模式中使用mysql 执行SQL 查询的一个文件,则mysql 在出现第一个错误后退出,或者,如果指定--force 选项,则不管出现多少错误,都不加选择地执行所有查询。程序可以围绕语句提供流程控制,以便可以有选择地适应查询的成功或失败。可以根据另一个查询的成功或失败来执行一个查询,或根据前一个查询的结果来决定下一步要做的事情。SQL 具有非常有限的语句间的连续性,这点也被带到mysql 中。使用一个查询的结果,并将它们应用于另一个查询中,或将多个查询结果联系在一起是困难的。L A S T _ I N S E RT _ID() 可用于获取由前一个语句最新生成的A U TO_INCREMENT 值,仅仅是关于它的。
更一般的情况是,要想检索一组记录,然后使用每一条记录作为一系列复杂的进一步操作的基础是困难的。例如,检索一个消费者列表然后查询每个消费者的详细信用历史,对每个客户来说可能要包括若干个查询。在某些情况下,可能想开发票,在发票头写上需要联系的客户信息,然后按次序列出每项条目。mysql 不适合这些类型的任务,因为可能需要依赖于前几个查询结果的若干查询,并且这些任务超出了mysql 的布局设计的能力。一般来说,除了mysql 外,还需要工具来执行包括主-细目关系和具有复杂输出格式需求的任务。程序提供将查询连接在一起的“胶”,并可用一个查询的输出作为另一个查询的输入。
■ 可以将MySQL 集成到任何应用程序中。许多程序都利用数据库的能力提供信息。通过发布一个快速查询,应用程序可以校验消费者号或检查一项条目是否在产品清单中。假设一个客户要寻找某些作者的所有书,则Web 应用程序可以在数据库中查找它们,
然后将结果显示在该客户的浏览器上。
通过使用调用带有包含SQL 语句的输入文件的mysql 的外壳脚本( shell script),可以实现一种初步的“集成”,然后,再使用其他UNIX实用程序加工这些输出。但是这可能变得很难看,特别是当任务变得更复杂时。当应用程序不断增长成为杂乱的修补工作时,它也可能产生一种“在工作,但觉得有错误”的感觉。此外,运行其他命令的外壳脚本的创建过程的开销可能超过您的预想。但它可能更有效率地与MySQL 服务器直接交互,当在应用程序执行的每个阶段需要它的时候,都可以精确地提取想要的信息。针对我们在第1章“MySQL 和SQL 介绍”中安装的样例数据库s a m p _ d b,我们已经列举了若干需要自己编写与MySQL 服务器交互的程序的目标。这些目标中的一些显示在下面的列表中:
■ 为打印而格式化Historical League 目录。
■ 考虑外观和联机目录的寻找。
■ 通过电子邮件向成员发送补充通知。
■ 使用Web 浏览器很容易地将分数输入到学分册中。
在一些细节方面,我们将考虑的一个方面是将MySQL 的能力与Web 环境结合起来。MySQL 不直接提供对Web 应用程序的支持,但通过组合带有适当的工具的M y S Q L,通过We b可以很容易地访问数据库。使用Web 服务器可以指定查询,向客户的浏览器报告结果。将MySQL 和Web 结合可能有两个想法:
■ 主要的兴趣在于数据库,只是想使用Web 作为工具来获取对数据更容易的访问。在这样的想法下,数据库的位置是清楚且明显的,因为它是兴趣的焦点。例如,可以编写Web 页来允许查看数据库所包含的表、表的结构,及表的内容。您打算使用Web 服务器来提高对MySQL 的访问能力。这可能也是MySQL 管理者的观点。
■ 主要的兴趣可能是Web 站点,为了使站点的内容对访问者更有价值,您可能想使用MySQL 作为一个工具。例如,如果为站点的访问者运行信息板或讨论清单,则可以使用MySQL 保留信息的轨迹。在这种情况下,数据库的角色更微妙,访问者甚至可以不关心您必须提供给他在服务器中执行的部分。您打算使用MySQL 提高Web 服务器的能力。这可能也是Web 站点开发者的一个观点。
这些想法并不矛盾。例如,在Historical League 情况下,我们想通过允许联机输入来作为成员获取访问成员目录内容的一种方法而使用We b。提供对数据库的访问是Web 的一个用法。同时,League 的Web 站点在某些方面有些不完全,所以向站点增加目录内容,以便为成员提高站点的价值。增强站点所提供的服务是数据库的一种用法。
无论您如何看待MySQL 与Web 的结合,实现方法都是类似的,即将前台的Web 站点与后台的MySQL 连接,使用Web 服务器作为媒介。Web 服务器将查询从用户发送到M y S Q L服务器,检索查询结果,然后将它们传送给客户,在浏览器上显示。
当然,不一定要联机处理数据,但这样做往往有好处,特别是与经过标准的MySQL 客户机程序访问数据做比较时:
■ 通过Web 访问数据,人们可以使用他们喜欢的浏览器,在他们喜欢的平台上运行。他们不限制MySQL 客户机程序所运行的系统。Web 浏览器更是这样,无论MySQL 客户机分布如何广泛。
■ Web 界面的使用比独立命令行的MySQL 客户机程序的使用更简单。
■ Web 界面可以根据特殊应用程序的要求来定制。而M y S Q L客户机程序是用固定接口来完成基本功能的工具。
■ 动态Web 页面扩充了MySQL 的能力,它可以做到用MySQL 客户机很难做到或根本不可能做到的事情。例如,仅用MySQL 客户机程序不可能真正地使一体化购买车辆的应用程序组合成整体。
任何编程语言都可用来编写基于Web 的应用程序,但是,有些语言比其他语言更适合一些。请参阅5 . 2节“选择A P I”,我们将看到这点。