网络数据库教程-第3日

---(原作/Richard Dice)
网络数据库教程 - 第三天
常规的Apache设置
MySQL和整个数据库/服务器系统
MySQL, SQL, DDL,和DML
我们不是在建立互联网站点吗,我是不是漏了什么东西?

一、第三天

网络数据库是一个很大的课题,用一个5天的教程不可能谈到所有的内容。我为你教授基础的知识,剩下的就要靠你自己在实践中体会和学习。

在本教程中我们只有时间讲解于网络数据库有关的设置问题。

Apache

Apache网络服务器 是一项性能相当不错的软件。简单地说,它的目的就是让用户能从你的计算机中请求网络信息。通常这些信息是HTML网页和图象(GIF和JPEG图象),但是现代的网络服务器都支持CGI (网络编程)。

这是Apache简单版本的功能。对于特定的应用,你需要对其进行设置,让其真正发挥功能。

Apache的功能实际上非常强大,你可以对其进行多种设置,执行多种功能。但现在我们只能讲解有关网络数据库的设置。今天所讲的需要和Apache其他的文献或我们在这里使用的软件包一起应用。

二、常规的Apache设置

进行常规Apache设置:

 

DocumentRoot概念比较容易理解。假设我们设立了域www.example.com。而URL可能如下所示:

 http://www.example.com/webmonkey/day3.html

我喜欢将我的DocumentRoot设置为/web/docs/,这样以来,相对应于该URL的文件将是/web/docs/webmonkey/day3.html.

假设你按照我昨天的课程中的建议安装了Apache,则你需要编辑/usr/src/apache_1.2.6/conf/srm.conf将DocumentRoot设置为/web/docs。 (编辑方法很简单,你一看就知道该怎么做。你还需要相应改变/usr/src/apache_1.2.6/conf/access.conf. (也不难)。在Unix提示符下,注意一定要实际建立该DocumentRoot子目录:

     mkdir /web; mkdir /web/docs

Perl和ePerl (将是明天的主要课程内容),和mod_perl一起就可建立起世界一流的数据库支持下的网站。缩头的课程中我建议你们使用了mod_perl的自动Apache创立功能,所以现在你应该有了这样一个文件 /usr/src/apache_1.2.6/src/httpd

接下来,你应该:

第1步:建立/usr/src/apache_1.2.6/src/httpd/usr/sbin/httpd之间的标志性链接。
建立标志性链接的意义是:你的Linux操作系统希望httpd放置在/usr/sbin子目录中,但是以后对httpd的任何重新的设置将把它该在/usr/src/apache_1.2.6/src下。整个特点使你无需每次将httpd拷贝到/usr/sbin下。
    cd /usr/sbin

    ln -s /usr/src/apache_1.2.6/src/httpd httpd
第2步:检查确保拟定设置中包括了mod_perl。
现在我们做一个快速检查,键入以下指令:
     /usr/sbin/httpd -v

屏幕将显示一条短信息:

     Server version Apache/1.2.6 mod_perl/1.08.
第3步”设置你的/etc/rc.d/rc.M文件。
该文件和DOS的自动批处理文件(autoexec.bat)类似。它在你的Linux服务器启动时运行。确保使所有必要的重新都被初始化并在boot时能够正常运行。如果你的rc.M文件中没有以下设置,你应该加入:
     # Start Web server:

     if [ -x /etc/rc.d/rc.httpd ]; then

       . /etc/rc.d/rc.httpd

     fi

这些代码意思是说:Linux的启动过程将激活文件/etc/rc.d/rc.httpd的内容 (以启动你的httpd)。这时,屏幕应显示:

     echo  httpd

     /usr/sbin/httpd -f /usr/src/apache_1.2.6/conf/httpd.conf &

或许你还没有整个文件,所以你需要生成该文件

第4步:使Apache能够处理CGI和ePerl文件。
现在你需要进行大量细节的设置。回到/usr/src/apache_1.2.6/conf子目录,然后:

access.conf中,确保以加重字体(bold)加入下列文字:

     <Directory /web/docs>

     Options Indexes FollowSymLinks ExecCGI

     AllowOverride None

     order allow,deny

     allow from all

     </Directory>

现在,修改srm.conf:

     DirectoryIndex index.iphtml index.cgi index.html

你还需要"uncomment" 某行,所以最后的设置为:

     AddHandler cgi-script .cgi 

httpd.conf中,, 在<VirtualHost>区域之上加入以下文字:

     Perlrequire /web/docs/startup.perl



     PerlModule Apache::ePerl

     <Files ~ ".+\.iphtml$">

         SetHandler  perl-script

         PerlHandler Apache::ePerl

     <Files>

现在你的/web/docs子目录下需要一个startup.perl文件,你可以拷贝我的:

     #!/usr/bin/perl

     use strict;

     use Apache::Registry;

     use CGI;

     use DBI ();

     1;

 

缺省情况下,除了你指定的/cgi-bin/子目录之外,Apache不会允许CGI程序在任何其他子目录中运行,如果安全性是你的首要考虑,这一条很重要。但由于现在我们谈的是网络数据库编程,所以在第4步中的设置让Apache运行CGI程序在其他子目录中也能运行。

我们还告诉Apache遇到带有特殊后缀.iphtml的文件时应该怎么做。这种文件叫做内部剖析后的HTML文件。现在Apache知道应该将这种文件转交ePerl进行进一步的处理。最后。我们告诉Apache在服务器初始化之后立即运行文件startup.perl。该文件把几个非常有用的模块载入服务器内存,重要之后的程序需要使用这些模块时就 无需重新载入它们。

 

三、MySQL和整个数据库/服务器系统

在第1天的教程中,我了解了数据库服务器常驻内存并可以回应请求、存储数据、提供管理界面确保数据只能在授权范围内被处理。现在我们将使用MySQL来实践这些概念。

 

建立好你的MySQL后,你需要进行的设置比起对Apache的设置就少多了。执行完完整的MySQL安装过程(包括运行/usr/local/src/mysql-VERSION/scripts/mysql_install_db)后,还有一项工作需要执行:将其设置为常驻内存的守护程序。这个过程和我们对httpd的做法相同。编辑/etc/rc.d/rc.M 文件使其包括以下代码:

     # Start mysql database server:

     if [ -x /etc/rc.d/rc.mysql ]; then

       . /etc/rc.d/rc.mysql

     fi

生成相应的rc.mysql文件。非常简单:

     /usr/local/bin/mysql.server start

当我使用MySQL时,我经常使用这两个程序:/usr/local/bin/mysql/usr/local/bin/mysqlshow。你不需要键入所有这些内容,- mysqlmysqlshow就能够正常工作,因为/usr/local/bin是指令路径的环境变量的一部分。

让我们试一下:

     rdice:# mysqlshow

     +-----------+

     | Databases |

     +-----------+

     | mysql     |

     | test      |

     +-----------+

这就是你应该看到的(假设你已经正确安装了Perl和Data::ShowTable)。这项输出项我们显示了:MySQL在最高级别上将数据安排到数据库中。上述两个显示由MySQL自动生成,每一项都有特殊用途:mysql被MySQL自己使用来生成程序自己的内部设置,test作为某种暂存区供所有用户使用,但是它没有任何安全防护机权限设置。也就是说,不要将任何重要信息放在test暂存区内。

我们再来一遍。但是这次我们将欲求mysqlshow告诉我test数据库中的内容:

     rdice:# mysqlshow test

     Database: test

     +--------+

     | Tables |

     +--------+

     +--------+

表格(Tables)是数据库中的下一级。你可以将表格想象为电子工作表:列(columns)代表数据域,而行(rows)则代表单个的记录。

从屏幕输出中我们可以看到test数据库是空的。我们将配合使用 mysql程序和MySQL并在数据库中放入具体的内容。

四、MySQL, SQL, DDL,和DML

同MySQL的互动交流指的是用它的语言SQL(结构化程序语言)。SQL一般划分为两部分,第1部分叫做DDL,即数据定义语言(data definition language),你用SQL这个单元告诉MySQL如何设立表格。还有一部分是DML,即数据控制语言( data manipulation language),这个单元用于从你的表格中获取数据。

这里是计划:我将启动mysql,生成一个表格,然后在表格中输入数据,然后检查我刚输入的数据。(我用加重体显示的文字解释各项指令的含义)

     rdice:# mysql test

     Welcome to the MySQL monitor.  Commands end with ; or \g.

     Your MySQL connection id is 4 to server version: 
3.21.28-gamma-log

     

     Type 'help' for help.

     

     mysql> create table albums (            这里我在使用DDL
         -> title varchar(100),              设置表格,在表格中
         -> artist varchar(100),             我将存储一些
         -> released date);                  音乐资料

     Query OK, 0 rows affected (0.07 sec)

     

    现在是DML,用于告诉MyDQL在album中加入记录

     mysql> insert into albums(title,artist,released)

         -> values('Selling England By The Pound','Genesis','
1973-01-01');

     Query OK, 1 row affected (0.08 sec)

     

      这里是DML声明,它将使我看到我刚才加入的内容
      注意*在SQL语言中指“所有列”
     mysql> select * from albums;

     +------------------------------+---------+------------+

     | title                        | artist  | released   |

     +------------------------------+---------+------------+

     | Selling England By The Pound | Genesis | 1973-01-01 |

     +------------------------------+---------+------------+

     1 row in set (0.06 sec)

 

MySQL所认可的所有SQL的语法在MySQL文献中都有详细说明,你随时可以查阅。即使今天的课程也已经涉及了许多进出知识,所以你应该仔细研究一下它。

生成表格的级别语法是:

     create table 表格名 (

        列1 列1数据类型,

        列2 列2数据类型,

        ...

        列_x 列_x数据类型

     )

各列可以使用的数据类型可以在MySQL文献中找到。在本例中我使用了"date"数据类型以及变量长度字符串。"varchar" 字符串的长度由预设的长度限制,在变量中,是100。

要结束mysql中的一个声明,你需要键入一个分号,然后回车。mysql将告诉你的“query(SQL中任何指令的术语)”状态,以及处理所用时间。

insert(插入)的语言更简单:

     insert into 表格(列1,列2,...,列_x)

     values(value1,value2,...,value_x)

字符串必须用引号圈起来。

select(选择)是SQL非常有用的声明,必要的时候,它的用法可能会非常复杂。

如果在该数据库中我存储了几百个音乐文件,而且我只想看一下有Genesis创作的作品,我就可以用select发出一个声明查询我所需要的内容:

     select title, released

     from  albums

     where artist = 'Genesis'

     order by released

这次我按名称圈定了我所感兴趣的列,而不是用* 通配符。命令行where artist = 'Genesis'限制必须查询MySQL记录中由Genesis创作的作品,我还命令MySQL将该作曲家的唱片按照发行日期排序。

除了insertselect指令,还有两种基本的DML指令:update(更新)和delete(删除)。 update使你能够改变在表格行中存储的数据;delete使你能删除表格中的一行。

这些指令的使用范例:

     我发现Selling England 的发行日期是2月1日而不是1月1日。所以我更新
我的记录:

     mysql> update albums

         -> set    released = '1973-02-01'

         -> where  title = 'Selling England by the Pound'

         ->        and artist = 'Genesis';

     Query OK, 1 row affected (0.03 sec)

     

     mysql> select * from albums;

     +------------------------------+---------+------------+

     | title                        | artist  | released   |

     +------------------------------+---------+------------+

     | Selling England by the Pound | Genesis | 1973-02-01 |

     | Wind & Wuthering             | Genesis | 1976-01-01 |

     | We Can't Dance               | Genesis | 1991-01-01 |

     +------------------------------+---------+------------+

     3 rows in set (0.00 sec)



     如果我认为我不喜欢Genesis ...     

     mysql> delete from albums where artist = 'Genesis';

     Query OK, 3 rows affected (0.00 sec)

     

     mysql> select * from albums;

     Empty set (0.00 sec)

使用"update" 和"delete" 指令时,你需要用where指明查询条件(否则你的表格中的每一行都会被修改或删除,你必须小心)

互联网中有一个很好的SQL教程,我建议仔细阅读该教程。它并不完全适用于MySQL,这是因为SQL也有不同的“方言”。该教程所讲的内容基本适用于MySQL,但有一些细微的区别,在MySQL的SQL文献中有具体说明。

今天的课程的最后,我们将再次研究一下mysqlshow:

     rdice:# mysqlshow test

     Database: test

     +--------+

     | Tables |

     +--------+

     | albums |

     +--------+

     rdice:# mysqlshow test albums

     Database: test  Table: albums  Rows: 0

     +----------+--------------+------+-----+---------+-------+

     | Field    | Type         | Null | Key | Default | Extra |

     +----------+--------------+------+-----+---------+-------+

     | title    | varchar(100) | YES  |     |         |       |

     | artist   | varchar(100) | YES  |     |         |       |

     | released | date         | YES  |     |         |       |

     +----------+--------------+------+-----+---------+-------+

mysqlshow记录了我们在mysql中所作的一切工作。当你要求mysqlshow显示表格信息时,它并不告诉你在表格中具体有什么信息,它只是告诉你表格中目前有多少行,它告诉你的是表格的结构。我们已经了解了"Field"和"Type" ,其他的表格资料年可以从MySQL的文献中找到详细内容)。

五、我们不是在建立互联网站点吗,我是不是漏了什么东西?

我们现在已经了解了数据库的基本知识。下面我们的任务是将这些SQL技术应用到互联网中。我们将用DBI(Perl的数据库界面)实现这一目的。我将SQL语言直接写入ePerl程序中,并用Perl的DBI模块支持其运行。

不要着急。我们已经建立了系统,剩下的只是编码。