|
|
This document is available in: English Castellano ChineseGB Deutsch Francais Nederlands Russian Turkce |
by Diego Alberto Arias Prad <dariapra(at)yahoo.es> About the author:
我是西班牙Lugo电信工程师。我不记得我开始使用Linux的准确时间,大概是1995或1996年吧。之前我是Microsoft
Windows用户,我甚至不知道Linux的存在。当我第一次在大学里看到运行Linux的计算机时就被吸引了。我立即在家中的计算机中安装了它,我记得我的第一个Linux发行版是Slackware。
Content: |
TclMySQL入门Abstract:
在文章中你将学习如何安装与使用MySQLTcl,它是一个可以利用Tcl脚本对MySQL数据库服务器进行SQL查询(select,insert,deltet...等操作)的Tcl库。文章中Tcl、MySQL服务器与MySQLTcl库的版本分别为 8.4.2, 4.0.15
和 2.40.
|
如果你的Linux发行版或*BSD系统支持包(如RPM或DEB)或ports(比如Crux Linux
或 FreeBSD,)安装方式,你可以使用包或ports系统来安装 MySQLTcl
并跳过这一节的内容。
如果你不能使用上述方式或者你更喜欢手工安装,我将在下面给出我的安装步骤。不过这只是基本指导方针而不是手把手的安装手册。在Mandrake发行版中(9.2版),使用如下bash命令:
$ ./configure --with-mysql-lib=/usr/lib $ make $ make install |
$ export CPP=/usr/bin/cpp $ ./configure --with-tcl=/usr/lib/local/tcl8.3 --with-tclinclude=/usr/local/include/tcl8.3 --with-mysql-include=/usr/local/include/mysql --with-mysql-lib=/usr/local/lib/mysql $ make $ make install |
这一节中我会向对本文有兴趣但并不了解Tcl的读者简要的介绍一些Tcl的基础知识。如果你已经是一名Tcl程序员,你可以跳过此节。
你可以复用这小节(以及其后的)中展示的Tcl shell(tclsh)例子。
Tcl 使用命令set来建立变量。请看下面的例子:
% set address {Edison Avenue, 83} Edison Avenue, 83 % set zip_code 48631 48631 |
% set address Edison Avenue, 83 % set zip_code 48631假设我们想将变量address的值打印到屏幕上,可以使用puts命令:
% puts stdout [set address] Edison Avenue, 83我们向命令puts传递了参数 stdout。 这个参数告诉puts在标准输入上打印,在这里指的是屏幕。传递给puts的第二个参数是 [set address]。方括号告诉Tcl解释器,括号内是另一条Tcl命令,它必须在puts命令之前被Tcl解释器执行 ,这叫做命令置换。还可以用另一种方法来完成相同的工作:
% puts stdout $address Edison Avenue, 83这个例子里我们所做的叫做变量置换:变量名前的字符 $ 表示要进行变量置换。
% puts stdout "the zip code is [set address]" the zip code is 48631 % puts stdout "the zip code is $address" the zip code is 48631 % puts stdout {the zip code is [set address]} the zip code is [set address] % puts stdout {the zip code is $address} the zip code is $address通过例子我们可以看到,使用圆括号进行组合,不会发生命令与变量置换,但使用双引号时它们将会产生作用。
% unset address % set address can't read "address": no such variable % unset zip_code % set zip_code can't read "zip_code": no such variable
字符串是Tcl三种基本数据结构之一。一个字符串是一些字符的集合。使用set命令能够建立字符串。
% set surname Westmoreland Westmoreland % set number 46.625 46.625变量 surname 和 number都是字符串。 字符串可以使用 string 命令来操作。 string 命令的一般语法为:string 操作 字符串值 其它参数。 让我们通过几个例子来了解这个命令是如何使用的:
% string length $surname 12 % set surname [string range $surname 0 3] West % puts stdout $surname West % string tolower $surname west与 Java 或 Pascal不同, Tcl 不是一个强类型编程语言,这一点从下面的例子可以看出来:
% set number [expr $number + 24.5] 70.125 % string range $number 2 5 .125通过命令 expr,变量number 的值增加了 24.5。之后使用string命令将变量number当作字符串进行处理,以显示它最后的四个字符。
Tcl 链是一种将元素通过空格分开并有特别的解释特殊字符串(string)。
% set friends_list {Fany John Lisa Jack Michael} Fany John Lisa Jack Michael % set friends_list [string tolower $friends_list] fany john lisa jack michael % set friends_list fany john lisa jack michael有几个Tcl命令用于链的操作。下面是几个例子:
% lindex 2 $friends_list lisa % lrange $friends_list 2 4 lisa jack michael % set friends_list [lsort -ascii $friends_list] fany jack john lisa michael % set friends_list fany jack john lisa michael % set friends_list [linsert $friends_list 2 Peter] fany jack Peter john lisa michael % string toupper $friends_list FANY JACK PETER JOHN LISA MICHAEL从最后一个例子可以看出链与字符串实际上是相同的数据结构。
数组可以看作一个用字符串值作索引的链。数组可象下面的例子那样被创建:
% set phone_numbers(fany) 629 629 % set phone_numbers(michael) 513 513 % set phone_numbers(john) 286 286数组的值可以使用set命令与变量置换来得到。同上面的例子一样,字符串索引是用括号标识的:
% set $phone_numers(michael) 513命令 array 返回数组变量的相关信息。让我们通过一些例子来看看这个命令能作些什么:
% array size phone_numbers 3 % array names phone_numbers fany john michael
在使用Tcl脚本对数据库进行任何查询之前,必须与数据库服务器建立联接。这一小节中我们将学习如何联接以及如何处理在尝试联接数据库服务器时出现的错误。
看看下面这个用于联接MySQL数据库的Tcl脚本:
0: #!/usr/bin/tclsh8.4 1: 2: package require mysqltcl 3: global mysqlstatus 4: 5: set port {3306} 6: set host {127.0.0.1} 7: set user {john_smith} 8: set password {jsmith_password} 9: 10: set mysql_handler [mysqlconnect -host $host -port $port -user $user -password $password] 11: 12: mysqlclose $mysql_handler请注意,左边那一排数字与冒号并不是Tcl脚本的内容,只是为了方便解释所标识的行号。同样要注意,根据你所使用的Linux版本,你可能要将第0行更改为正确的Tcl shell路径。
在上一节中脚本的第3行还没有解释。这是我们现在要作的。
MySQLTcl 库中的命令可能会产生错误。如果一个错误没有被捕获,脚本将中断,这个结果可能会引起我们的注意也可能不会。让我们用下面的方法来更改原先的脚本:
10: if [catch {mysqlconnect -host $host -port $port -user $user -password $password} mysql_handler] { 11: puts stderr {error, the database connection could not be established} 12: exit 13: } else { 14: mysqlclose mysql_handler 15: }如果命令 set mysql_handler [mysqlconnect -host $host... 产生一个错误,错误将被命令catch捕获。如果在执行花括号内的命令时出现错误catch将返回1,反之则返回0。变量 mysql_handler 用来保存花括号内命令执行的结果。
element | meaning |
code |
如果没有错误发生 mysqlstatus(code) 等于0;否则设置为MySQL错误代码。如果错误不是由MySQL服务器引起的, mysqlstatus(code)设置为
-1。
任何MySQLTcl库中的命令执行后 mysqlstatus(code) 的值都会更新。 |
command |
最后执行的MySQLTcl 库命令引发的错误保存在 mysqlstatus(command)中。
mysqlstatus(command) 是在MySQLTcl库命令执行失败时才更新,因此如果 MySQLTcl命令都成功执行它将不会更新。 |
message | mysqltcl(message) 的值在任何MySQLTcl命令执行失败后被更新为包含错误信息的字符串。与mysqlstatus(command)一样如果 MySQLTcl命令都成功执行它将不会更新 |
element | meaning |
nullvalue | 用于表示一个SQL查询结果为空的情况。 musqlstatus(nullvalue) 可以被设置为任何字符串,默认为一空字符串。 |
10: catch {mysqlconnect -host $host -port $port -user $user -password $password} mysql_handler 11: if {$mysqltatus(code) != 0} { 12: puts stderr $mysqlstatus(message) 13: } else { 14: mysqlclose mysql_handler 15: }很明显全局数组能够处理除了在建立数据库联接时引发的错误之外更多的错误。
这一节中将介绍大多数MySQLTcl中的基本命令,我还将通过一些例子来展示如何使用它们。更完整的内容,请参考MySQLTcl库man页。
下面的表中列出了这一节中要介绍的命令。参数用下划线标出。如果参数在两个?号之间,表示它是可选的,字符|表示�或�。
command | short description |
mysqlconnect ?option value ...? | 联接到一个数据库;将返回一个其它mysqltcl命令必须使用的联接句柄。 |
mysqluse handle dbname | 将一个MySQL句柄与指定的数据库相关联。 |
mysqsel handle sql_statement ?-list | -flatlist? | 发送SQL select语句到数据库。 |
mysqlexec handle sql_statement | 发送除了select 之外的SQL语句到数据库。 |
mysqlclose handle | 关闭一个数据库联接。 |
这个命令已经在 "建立数据库联接"一节中讨论过了。不过有一个额外的参数在前面没有说到:-db。使用参数 -db,可以直接指定随后的SQL语句所使用的数据库。看下面的例子:
% set mysql_handler [mysqlconnect -h 127.0.0.1 -p 3306 \\ -user john_smith -password jsmith_password -db jsmith_database]数据库句柄 mysql_handler 将名为jsmith_database的数据库指定为MySQLTcl命令的目标数据库。
这个命令将改变由第一个参数给出的MySQL句柄所关联的数据库。
这个命令发送 SQL select语句到由MySQL句柄所关联的数据库。如果参数 sql_statement 不是一个SQL 选择语句将会引发错误。
第三个参数可以是 list 或 flat_list。让我们通过一个例子来看看这个参数对命令的输出会产生什么样的影响。假设MySQL句柄所关联的数据库中有一个名为people的表,内容如下:
id | first_name | last_ name | phone |
26 | Karl | Bauer | 8245 |
47 | James | Brooks | 1093 |
61 | Roberto | Castro Portela | 6507 |
% mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} -list {Karl Bauer} {James Brooks} {Roberto {Castro Portela}} % mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} -flatlist Karl Bauer James Brooks Roberto {Castro Portela}在第一句中 (使用参数-list), 命令返回的链中全部元素也都是独立的链。而第二句 (使用参数-flatlist),命令返回一个单一的链全部元素都是互相联接的。
% mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} 3
mysqlexec 命令发送非选择 SQL语句到由MySQL名柄所关联的数据库。如果参数 sql_statement
是一个选择语句,并不会产生一个错误,但它不作任何事。
看我们看看上一段中显示的例子:
% mysqlexec $mysql_handler {delete from people where id=26} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 1093} {Roberto {Castro Portela} 6507} % mysqlexec $mysql_handler \\ {insert into people (id, first_name, last_name, phone) values (58, "Carla", "di Bella", 8925)} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 1093} {Carla {di Bella} 8925} {Roberto {Castro Portela} 6507}当然,除了delete与insert之外的SQL命令也可以使用这个命令发送到数据库。比如,更新(update):
% mysqlexec $mysql_handler {update people set phone=3749 where first_name="James"} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 3749} {Carla {di Bella} 8925} {Roberto {Castro Portela} 6507}mysqlexec 如果执行成功则返回被发送到数据库的非选择SQL语句所影响的行数。
就象之前看到的,命令 mysqlclose 用来关闭与数据库的联接。这个命令的参数是一个MySQL句柄,它指向与我们想关闭的数据库。
MySQLTcl 库 除了这一节所展示的五个命令之外还有更多的命令。使用它们可以检索数据库的相关信息,转义字符串以适应它们的查询,进行嵌套查询等等。 MySQLTcl的man页是一个很好的参考,它是MySQLTcl库安装的一部分。
[1] a slightly skeptical view on John K. Ousterhout and Tcl:
http://www.softpanorama.org/People/Ousterhout/index.shtml
[2] Tcl 正则表达式教程
http://www.mapfree.com/sbf/tcl/book/select/Html/7.html
TclTutor是一个自由的可交互式学习Tcl的程序:
http://www.msen.com/~clif/TclTutor.html
MySQL 文档,有多种格式 (HTML, PDF...):
http://www.mysql.com/documentation/index.html
|
Webpages maintained by the LinuxFocus Editor team
© Diego Alberto Arias Prad, FDL LinuxFocus.org |
Translation information:
|
2004-03-08, generated by lfparser version 2.46