最新IBM水货笔记本价格,详细点击进入

查看完整版本: MySQL数据库技术(27)

风舞残阳 2008-4-2 17:55

MySQL数据库技术(27)

[color=#0000ff]5.1MySQL可用的API
[/color]
为了方便应用[wiki]程序[/wiki]的开发,MySQL提供了用C[wiki]编程[/wiki]语言编写的客户机库,它允许从任何C程序的内部访问MySQL[wiki]数据库[/wiki]。客户机库实现应用程序编程接口(API),API定义客户机程序如何建立和执行与[wiki]服务器[/wiki]的[wiki]通信[/wiki]。
然而,使用C来编写MySQL程序并不受限制。许多其他语言[wiki]处理器[/wiki]本身也是由C编写的,或具有使用C库的能力,所以MySQL客户机库提供了这个方法,由此,MySQL对这些语言的约束可以建立在CAPI的上面。这就为与MySQL服务器通信而编写应用程序提供了许多选择。客户机程序的API是用Perl、[wiki]PHP[/wiki]、Java、[wiki]Python[/wiki]、C++、Tcl和其他一些语言编写的。有关最新的清单,请查看MySQL参考指南或MySQLWeb站点,因为有时会增加用新语言编写的API。
每种语言约束都定义自己的接口,特别是访问MySQL的规则。这里没有足够的[wiki]时间[/wiki]来讨论MySQL可使用的每种API,我们只讲述最流行的三种:
■C客户机库API。这是MySQL的基本编程接口。
■Perl通用目标[wiki]脚本语言[/wiki]的DBI(数据库接口)API。DBI是作为与其他模块在DBD(数据库驱动程序)级接口的Perl模块来实现的,每个模块都提供对特定[wiki]类[/wiki]型的数据库引擎的访问(当然,我们将讨论的特定的DBD模块也提供对MySQL的支持)。DBI对MySQL的最普遍用法是编写由命令行来调用的独立的客户机,以及试图由Web服务器调用的脚本来提供Web对MySQL的访问。
■PHPAPI。PHP是一种脚本语言,它提供了在Web页中嵌入程序的一种便利的方法。在发送以前,这样的页面由PHP来处理,它允许这些脚本生成动态的内容,如在页面中包括MySQL查询的结果。“PHP”原始的意思是个人主页(PersonalHomePage),但是PHP的成长已经远远超过它简单的原始功能。PHPWeb站点现在使用的这个名称表示“PHP:超文本预处理程序(HypertextPreprocessor)”,它像GNU(是GUN而不是UNIX)一样以同样的方式自我引用。
使用他人成果
当[wiki]标准[/wiki]的MySQL客户机不能满足需要时,您并不总是需要编写自己的程序。其他一些人一直编写程序,而这些程序中有许多是可[wiki]共享[/wiki]得到的。请参阅附录I中的一些样例。只要找到几个就能节省您的许多工作。
以上这三种API都有专门章节详细说明。本章只提供对API比较的概述,用来说明它们的基本特征,并给出对特定的应用程序可能选择某个而不是其他API的原因。
当然,不必只考虑某个API,应了解每个API,并用可以明智选择适合自己的API。在包括若干组件的大项目中,可能使用多个API,多种语言,这取决于每个子任务适合哪一种语言。
对于试图使用的任何一种API,如果需要得到必需的[wiki]软件[/wiki],请参阅附录A。

[color=#0000ff]5.1.1CAPI
[/color]
CAPI用于编译C程序上下文[wiki]环境[/wiki]内部。它是一种客户机库,提供可用来与MySQL服务器对话的最低级别的接口——具有创建与服务器通信所需的能力。DBI和PHP的前身DBI的Perl前身是Mysqlperl模块Mysql.pm。这个模块不再被支持,而且不应该用于新的MySQL的开发。有一件事需要明白,Mysqlperl是依赖于MySQL的,但DBI不是。如果编写MySQL的Perl应用程序,然后,决定想用另外一种数据库引擎来使用它们,则移植DBI脚本比Mysqlperl脚本更容易一些,因为它们很少依赖于特定的数据库引擎。
如果获取了访问MySQL的一段Perl脚本,并发现它是用Mysqlperl而不是DBI编写的,则仍然可以使用DBI。DBI包括了对Mysqlperl的仿真支持,因此不需要安装两个程序包。PHP3的前身是PHP/FI2.0(FI代表“forminterpreter,即格式解释程序”)。像Mysqlperl一样,PHP/FI也是过时的,所以我们就不再进一步讨论它了。
MySQLCAPI的起源如果已经有编写mSQLRDBMS程序的经验,那么将注意到MySQLCAPI类似于mSQL相应的CAPI。当MySQL的开发者们开始实现他们的SQL引擎时,许多有用的共享实用程序可用于mSQL。要想花费最小的难度将那些mSQL实用程序移植为MySQL的
实用程序是可能的,可有意地将MySQLAPI设计为与mSQLAPI类似(MySQL甚至带有与mSQLAPI函数名称相应的MySQL名称的简单的文本替代品的msql2mysql脚本。这个操作相对烦琐,实际上也照顾了许多涉及为使用MySQL而转换mSQL程序的工作)。
MySQL分发包提供的C客户机是基于这个API的。C客户机库也作为MySQL对其他语言约束的基础来提供服务,但JavaAPI是一个例外。例如,通过连接MySQLC客户机库代码(这个过程在附录A中通过DBI和PHP安装指导来举例说明),MySQL可用PerlDBI模块专有的MySQL驱动程序和PHP代码。

[color=#0000ff]5.1.2PerlDBIAPI
[/color]
DBIAPI用于Perl脚本语言编写的应用程序的上下文环境内部。这种API在我们考虑的这三种API[wiki]结构[/wiki]中是最高的,因为它可与许多数据库工作,而同时在脚本中可忽略许多特定数据库的细节。DBI经过使用两级结构的Perl模块来实现(请参阅图5-1):
■DBI(数据库接口)级。为客户机脚本提供接口。这个级别提供的是抽象接口,并不是指特定数据库引擎。
■DBD(数据库驱动器)级。在这个级别由特定引擎的驱动程序来提供对各种数据库引擎的支持。

[img]http://www.wangyeba.com/Article/UploadFiles/200512/20051214202952906.JPG[/img]

MySQL对DBI的支持环境由Msql-Mysql-modules分发包提供。这个模块在DBD级操作。可以从分发包名称及图5-1中分辨它,一个驱动程序可以提供对一个以上的RDBMS的支持。Msql-Mysql-Modules最初是为mSQL而编写的,后来扩展到MySQL。这种影响类似于对mSQL和MySQL的CAPI。由于设计的MySQLCAPI类似于mSQLCAPI,所以将mSQLDBD(使用mSQLCAPI)扩展到对MySQL的使用很有意义。
DBI体系结构编写应用程序的风格相对普通。当编写DBI脚本时,可使用一组标准的调用。DBI级在DBD级调用适当的驱动程序来处理请求,对于想使用的特定数据库服务器通信中包括的特定问题,由驱动程序处理。DBD级传送从服务器返回的数据,备份到DBI级,使
数据出现在应用程序中。数据的格式与数据库的数据来源一致。
其结果得到这样一个接口,该接口从应用程序的编写者的观点隐藏了数据库引擎之间的差异,这样可使用多种不同的引擎——和驱动程序一样多。DBI通过允许以统一风格访问每个数据库来提供一致性客户接口以增加可移植性。
当打开数据库时,出现由脚本编写的数据库专有的界面。当创建连接时,应指出使用哪个驱动程序。例如,要想使用MySQL数据库,应这样连接:

[img]http://www.wangyeba.com/Article/UploadFiles/200512/20051214202953707.JPG[/img]

而要想使用Postgres或mSQL,应这样连接:

[img]http://www.wangyeba.com/Article/UploadFiles/200512/20051214202953121.JPG[/img]

连接以后,对该驱动程序不需要再做任何做特殊的引用。让DBI和该驱动程序解决数据库专有的细节。
无论如何这都是[wiki]理论[/wiki]问题。然而,至少有两个因素与DBI脚本的可移植性矛盾:
■在RDBMS引擎之间SQL的实现不同,为一个引擎编写的SQL另一个引擎根本不理解是完全可能的。如果SQL相当通用,则脚本可在引擎之间作相应的移植。但如果SQL依赖于引擎,则脚本也是这样。例如,如果使用MySQL指定的SHOWTABLES语句,则该脚本不能用其他数据库执行。
■DBD模块通常提供引擎专有类型的[wiki]信息[/wiki]来允许脚本编写者使用特定数据库[wiki]系统[/wiki]的特定功能。例如,MySQLDBD提供访问查询结果中列属性的方法,如每列的最大长度、列是否是数值型的,等等。而这些属性在其他数据库中没有任何相似物。DBD专有的特性与可移植性相背,通过使用它们,将MySQL编写的脚本用于其他数据库系统是困难的(然而,在第7章中,您将发现,笔者毫不费力地避免了由MySQLDBD提供的MySQL专有的结构。那是因为您应该知道那些结构是什么,以便可以决定自己是否使用它们)。
尽管存在数据库专有脚本的这两个因素,但以抽象方式提供数据库访问的DBI机制是完成可移植性的合理方式,只要您决定利用它多少次即可。

[color=#0000ff]5.1.3PHPAPI
[/color]
像Perl一样,PHP也是一种脚本语言。但它与Perl不同,PHP很少作为通用目标语言来设计,而是作为编写Web应用程序的一种语言。PHPAPI主要作为在Web页面中嵌入可执行脚本的一种方法来使用。这使Web的开发者们很容易用动态生成上下文环境来编写页面。
当客户[wiki]浏览器[/wiki]向Web服务器发送PHP页面的请求时,PHP执行在该页面中它所发现的任何脚本,并用脚本的输出来替换它。该结果再送回浏览器。这就使浏览器中实际出现的页面根据请求的页面环境的不同而有所不同。例如,当在Web页面中嵌入下面简短的PHP脚本时,它出现所请求页面的主机IP地址:

[img]http://www.wangyeba.com/Article/UploadFiles/200512/20051214202953443.JPG[/img]

可以使用脚本为访问者提供基于数据库上下文环境的最新信息。下面的样例说明可用于HistoricalLeagueWeb站点的一个简单脚本。该脚本发布一个请求来确定当前的League的成员数目,并将该数目报告给访问该站点的人(如果出现错误,则该脚本不报告任何数目):

[img]http://www.wangyeba.com/Article/UploadFiles/200512/20051214202953796.JPG[/img]

DBI和DBD的含义
尽管DBI级是独立于数据库的,而DBD级是依赖于数据库的,但那并不是“DBI”和“DBD”所代表的意义。它们的意思是“数据库接口”和“数据库驱动程序”。
PHP脚本通常看起来像是带有嵌入在“%26lt;?php”和“?%26gt;”标识符中的脚本的HTML页面。一个页面可能包括若干个脚本。这为脚本的开发提供了一种非常灵活的方法。例如,如果您喜欢,可以编写一个正常的HTML页面来创建通用的页面框架,然后再增加脚本的内
容。
对于不同的数据库引擎,PHP对统一的接口不再作任何事情,DBI也用这种方法。取而代之,每个引擎的接口看起来非常像相应的实现该引擎低级API的C库接口。例如,用于从PHP脚本内部访问MySQL的PHP函数的名称非常类似于MySQLC客户库中函数的名称。
页: [1]
查看完整版本: MySQL数据库技术(27)