数据库的导出与导入。

这里介绍的是数据库的导入与导出,

其实,单个数据表的导入与导出也是这些命令,

只是携带的”参数“不同而已。

具体的方法,可以在Shell中运行 “命令 --help” 来查看。

下面只是介绍常用的对数据库的导入与导出方法。

------------------------------

导出数据库。

命令:$pg_dump  testdb >  testdump.dmp

解释:将数据库testdb备份成文件testdump.dmp。包括表的建立与表中的数据。

------------------------------

导入数据库。

命令:

$create -E UTF8  testdb1

$psql  testdb1 < testdump.dmp

解释:

1、先创建一个数据库testdb1,为了将dump文件导入这个数据库,

-E选项是为了指定这个数据库的字符集。取决于导出数据库的字符集。

2、psql 命令使用重定向符”<“将dump文件导入指定的数据库。

3、导入数据库以前除了要指定数据库端的字符集,又是还要设置客户端的字符集,

由于psql是在shell下执行的命令,不能使用\encoding指令,

所以要使用pgclientencoding环境变量,

所以要在导入数据库以前要执行命令:

export pgclientencoding='UTF8'

设置客户端正确的字符集,这里设置的UTF8是一个例子而已。

对于windows用户,可能是需要执行:

SET pgclientencoding='UTF8'

我也没有试过,应该是这句。

添加和删除用户。

添加用户。

createuser 是 SQL 命令 CREATE USER的封装。

命令:createuser  [-a] [-A] [-d]  [-D] [-e] [-P] [-h 主机名] [-p  port]  用户名

说明:

[-a]:允许创建其他用户,相当于创建一个超级用户;

[-A]:不允许此用户创建其他用户;

[-d]:允许此用户创建数据库;

[-D]:不允许此用户创建数据库;

[-e]:将执行过程显示到Shell上;

[-P]:创建用户时,同时设置密码;

[-h 主机名]:为某个主机上的Postgres创建用户;

[-p  port]:与-h参数一同使用,指定主机的端口。

例子:

1、不带参数的创建用户。

$ createuser testuser

Shall the new user be allowed to create databases? (y/n) n

Shall the new user be allowed to create more new users? (y/n) n

CREATE USER

不带参数创建用户时,Postgres会询问此用户的权限。

2、为指定的主机和端口上创建用户。

$ createuser -h 172.28.18.51 -p 5000 -D -A -e testuser

CREATE USER joe NOCREATEDB NOCREATEUSER;

CREATE USER

这个命令为主机172.28.18.51的5000端口创建用户testuser,

此用户不可以创建数据库和其他用户。

3、创建超级用户。

$ createuser -P -d -a -e testuser

Enter password for new user: testuser

Enter it again: testuser

CREATE USER joe PASSWORD 'testuser' CREATEDB CREATEUSER;

CREATE USER

这个命令在本地创建一个超级用户(-a),可以创建数据库(-d),

同时要求设置密码。

由于带了创建数据库和创建用户的参数,

所以Postgres不会像例子1中那样再次询问。

--------------------------------

删除用户。

命令:dropuser [-i] [-h] [-p] [-e]  用户名

解释:

[ -i]:删除用户前,要求确认;

[-h 主机名]:删除某个主机上的Postgres用户;

[-p  port]:与-h参数一同使用,指定主机的端口;

[-e]:将执行过程显示到Shell上。

例子:

1、删除本地的Postgres用户。

$ dropuser testuser

DROP USER

2、删除远程Postgres服务器上的用户。

$ dropuser -p 5000 -h 172.28.18.51 -i -e testuser

User "testuser" and any owned databases will be permanently deleted.

Are you sure? (y/n) y

DROP USER "testuser"

DROP USER

此命令删除主机172.28.18.51(-h)的5000端口(-p)的用户testuser,

并且需要确认(-i)。

psql的常用命令。

^_^

终于可以切入正体了。

-------------------------------

连接Postgres服务器后,

可能第一件事,就是连接到一个数据库进行实际的操作了,

如果您没有在运行 psql 命令时指定连接的数据库,

那么现在可以发出指令来连接一个数据库,

当然,在运行 psql 命令时指定连接的数据库的话,

也可以使用下面这个指令来改变连接的数据库。

命令:\c  数据库名

例子:

testdb=>\c  tesdb1

这条命令将当前连接的testdb数据库改变成 testdb1 。

------------------------------

下面就来看看如何断开与Postgres服务器的连接,

命令:\q

这个命令很简单,执行这个指令后,

就回到了shell提示符下了。

------------------------------

------------------------------

将数据库 导出到 文件标识符

命令:\copy 表名 to 文件名|标准输出 [delimiter  as  '分隔符']  [null  as 'null表示的字符串' ]

        [csv  quote  as '引号的类型'] 

解释:

可以将表中的数据输出到 文件或标准输出。

delimiter as '分隔符'   :说明输出设备的文本中表的每个字段用什么字符分割,默认是tab;

null  as 'null表示的字符串':说明输出设备的文本中表的NULL值的表示方法,默认为“\N”;

csv quote as '引号类型' :说明导出的csv文件中的引号类型是什么,

对于Postgres7.4以前的版本,不支持csv的导入与导出,这时不要使用这个可选项。

例子:

testdb=>\copy  testtable to data.csv  delimiter as ',' csv quote as '"'

这条命令将testtable表中的内容作为SQL语句,导出data.csv文件中。

delimiter as ','   :说明data.txt文本中表的每个字段用“逗号”分割;

csv quote as '"' :说明csv中的引号类型是“双引号”。

像前面说的:这个例子不适用在Postgres7.4以前的版本。

------------------------------

从 文件标识符 导入数据到数据库

命令:\copy 表名 form 文件名|标准输入 [delimiter  as  '分隔符']  [null  as 'null表示的字符串' ]

        [csv  quote  as '引号的类型'] 

解释:

可以从 文件名|标准输入 两个文件设备导入到指定的表中

delimiter as '分隔符'   :说明输入设备的文本中表的每个字段用什么字符分割,

通常是tab,取决于copy出去的文件是什么参数;

null  as 'null表示的字符串':说明输入设备的文本中表的NULL值的表示方法,通常为“\N”;

csv quote as '引号类型' :说明导入的csv文件中的引号类型是什么,

取决于copy出去的文件是什么参数。

例子:

testdb=>\copy  testtable from data.csv  delimiter as ',' csv quote as '"'

这条命令将data.csv文件中的文本,作为sql语句导入到testtable表,

delimiter as ','   :说明data.txt文本中表的每个字段用“逗号”分割;

csv quote as '"' :说明csv中的引号类型是“双引号”。

------------------------------

显示和设置客户端字符集。

命令:\encoding [ encoding ]

解释:

在数据库领域,存在字符集的转换问题,

一般地,服务器端字符集是在建立数据库时指定的,

为了能够在不同的客户终端显示正确的数据,

需要认为的为客户终端设置客户端字符集。

如果服务器端的字符集是EUC_JP(日语字符集),

而客户终端的字符集是GBK,

捡索出来的汉字数据很可能就出现乱码,

所以要统一两边的字符集。

例子:

1、显示客户端字符集

testdb=>\encoding

这条命令没有带可选参数,

所以显示当前的客户终端字符集。

2、设置客户端字符集

testdb=>\encoding 'EUC_JP'

这条命令设置当前的客户终端字符集为“EUC_JP”,

如果服务器端的字符集也是“EUC_JP”,就可以正常显示数据了。

------------------------------

除了上面这些介绍,在这个客户终端可以使用所有标准SQL语句,

对数据库进行操作。

使用psql连接Postgres数据库。

前面已经介绍了Postgres的安装,

和远程连接Postgres服务器的方式,

这次就说一下如何使用Postgres。

命令:psql 【选项】 <数据库名称>

举例:

1、连接本地的Postgres服务器

psql

然后输入密码即可连接testdb。

注意:这种方式使用的很少,

因为没有带任何“选项”,

所以使用的都是默认值。

它将以当前操作系统的登陆名登陆,

并且请求连接Postgres服务器中以当前操作系统的登陆名同名的数据库。

2、连接本地的一个数据库testdb

psql testdb

然后输入密码即可连接testdb。

注意:此时连接Postgres的用户是操作系统的登陆用户。

3、指定一个用户testuser、连接本地的一个数据库testdb

psql -U testuser testdb

然后输入密码即可使用户testuser连接testdb。

注意:此时使用了“-U”选项指定一个Postgres已存在的用户。

至于如何向Postgres添加用户,后面再说。

4、指定一个用户testuser、连接远程的Postgres(172.28.18.51)的一个数据库testdb

psql -U testuser -h 172.28.18.51 testdb

然后输入密码即可使用户testuser连接到主机为172.28.18.51上的testdb。

注意:此时使用了“-h”选项指定一个远程Postgres主机的IP(或主机名)。

要想实现远程连接Postgres主机,请参看【远程连接PostgreSQL服务器。】

至此,就连接上了Postgres服务器,

提示符将变成:

数据库名=>

可以使用SQL语句进行数据库的操作了。

远程连接PostgreSQL服务器。

众所周知,Postgres 8.1 分别发行了 Linux和Windows 两个版本,

所以,介绍远程连接的主题时,也是分别介绍这两个系统上是如何实现的。

其实,windows版比linux版的步骤少一些。

一、实现远程连接Linux上的PostgreSQL服务器。

主要分两个步骤:

<1>要使Linux上的PostgreSQL打开 “unix的tcpip套接子”。

编辑 $POSTGRES/data/postgresql.conf 文件,

将tcpip_socket=off改成tcpip_socket=on即可。

<2>设置远程访问认证机制。

编辑 $POSTGRES/data/pg_hba.conf 文件,

这个文件上面一大堆都是介绍如何使用这个文件使进行配置的,

最下面才是真正让我们填写东西的地方。

其中,有一行注释:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

说明每一行有五个字段,

分别是:连接类型、可使用的数据库名、使用者、DIDR地址、和验证方法等五项。

下面,我只介绍一些针对每个字段常用的选项。

字段一:TYPE。

可以选择:local或host。

前者只能允许本地的用户登陆Postgres数据库;后者可以接受远程客户登陆。所以,

我们应该使用“host”。

字段二:DATWABSE。

连接用户可以使用的数据库名字。可以使Postgres的一个具体的

数据库名,也可以使用“all”来允许用户访问所有数据库。

字段三:USER。

可以指定某个具体的用户来连接Postgres数据库(还要结合后面的地址字段),

也可以使用“all”来允许所有用户连接数据库。

字段四:DIDR-ADDRESS。

这可能会让您不知所措,不知道它为何物。

其实,它就是IP地址与掩码的另一种表示方法而已。

Postgres是通过这个字段来了解,允许那些IP或IP网段连接此服务器。

它的格式是: IP地址/掩码。

这个掩码和子网掩码是一个道理,只不过是用一个小于等于32的正数来表示,

表示的正是子网掩码中高几位为1,

比如,255.255.255.0 就是“24”,说明高24位是1。

192.168.0.1/32 相当于 IP为192.168.0.1,子网掩码为255.255.255.255的网段,

很显然,这只表明192.168.0.1IP自己。

如果您对IP地址与子网掩码不太了解,请查看相关资料。

字段五:METHOD。

这是验证方法。可选的有:

reject:拒绝这个IP的用户访问;

md5:密码以md5作为hash编码;

password:密码作为明文传输(好恐怖!);

krb5:密码以krb5作为hash编码。

下面举一个例子,来说明如何进行设置:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

#允许IP为192.168.0.1的所有用户登陆到Postgres服务器的所有数据库,采用md5验证。

host      all                 all            192.168.0.1/32          md5

#允许用户testuser在192.168.0.XX的网段任意机器登陆Postgres服务器,

#只能使用数据库testdb,采用md5验证。

host      testdb           testuser 192.168.0.1/24          md5

==============================================

二、实现远程连接Windows上的PostgreSQL服务器。

前面都已经看懂后,这个配置就很简单了,除了上面介绍的步骤<1>不用修改后,

只需要配置步骤<2>中介绍的东西即可。(因为winodws不会存在unix的tcpip套接子)。

安装PostgreSQL。

    现在最新版本的 Postgres 8.1 已经发行了 for windows 版本的发行包,

可以在官方网站得到 “http://www.postgresql.org/”。

   由于它最早出现在 *nix 系统上,

而且它的文档也多是使用 *nix 上的概念,

所以,这里介绍一下此软件在 Linux 下的安装。

(只要有在windows下安装软件经验的朋友,都可以在windows下顺利安装它)

  由于我使用的Linux是SlackWare,所以,有一些词语会涉及到SlackWare,不过,

对于其他发行版本的Linux也适用。

  1、在 http://www.postgresql.org/ftp/source/v8.1.3/ 这里下载 postgresql-8.1.3.tar.bz2 这个文件,

这就是我们要安装的发行包。

  2、顺序执行下面的命令,每个命令是一行:

<1>tar jxvf postgresql-8.1.3.tar.bz2 //解开发行包

<2>cd postgresql-8.1.3 //进入软件目录

<3>./configure --prefix=PREFIX //PREFIX是自己想安装到哪里的路径,比如/usr/local/postgres

<4>make //使用GNU make工具编译源代码

<5>make install //最后安装软件。

  3、起动Postgres不能使用root用户(Postgres不建议这样作),所以,接下来创建一个专门管理Postgres的用

户:

useradd -m postgres //追加一个叫postgres的用户, -m是为这个用户自动建立一个home目录。

passwd postgres //为这个用户修改密码,刚才添加用户时没有指定密码,所以现在只需输入新密码并确认密

码即可。其实,在useradd的时候也可以顺便设置密码的,感兴趣的话,自己研究一下吧!

  4、为了postgres用户可以正常使用postgres软件,下面将安装postgres软件的目录的拥有者改成postgres用

户:

比如安装在了/usr/local/postgres 这里,那么,以root身份执行

" chown postgres -R /usr/local/postgres "。

chown用于改变一个路径的拥有者, -R 用于将拥有者置于指定路径及其子目录。

  5、创建数据库集群:

<1>由于要管理postgres软件,所以,首先将用户改成postgres。执行命令 " su postgres ",如果是非root用

户执行这个命令,还要输入postgres用户的密码才行。

<2>进入postgres安装目录的bin文件夹。

<3>执行 " ./initdb -D /usr/local/pgsql/data "

  6、所有东西都准备好了,就该起动服务器了。

<1>执行“ ./pg_ctl start -l logfile ”。

<2>然后可以运行“ ./psql ” 来使用PostgreSQL软件了。

  7、每次都到$POSTGRES_HOME/bin中,执行“点”命令显得有点傻,所以,还是将Postgres的安装目录

加入到PATH环境变量中,使得每次启动机器,都可以使用其bin目录中的命令进行管理:

这里介绍一个简单的方法,编辑 "/etc/profile" 文件,在"export PATH"句(可能还包括其他环境变量)前面

加上一句:"PATH=$PATH:/usr/local/postgres/bin"(不含双引号,冒号后面适Postgres安装目录的bin目录)即

可。

  8、通常,需要在Slackware 起动的时候,自动起动PostgreSQL服务器,需要修改文件 /etc/rc.d/rc.local

,加入下面代码:

su - postgres -c 'postgres安装目录/bin/pg_ctl -D postgres安装目录/data -l ~/postgersql.log start'

例如:安装在 /usr/local/postgres 目录,就可以写成:

su - postgres -c '/usr/local/postgres/bin/pg_ctl -D /usr/local/postgres/data -l ~/postgersql.log

start'

由于SlackWare是BSD风格的linux,所以我采用了这种简单的方式,

如果您的linux属于SysV风格,也可以将启动脚本放到 /etc/rc.d/rc.3和/etc/rc.d/rc.5 目录下,

并作相应的设置。

不过,无论是BSD风格还是SysV风格的Linux,都可以使用我在(8)中介绍的方式实现开机启动Postgres的目的。

PostgreSQL学习计划。

PostgreSQL是一个非常优秀的开源数据库系统,

它是以加州大学伯克利分校计算机系开发的  POSTGRES 版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。 POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。

使用它,应该不会让用户失望的。

让我们就一起努力学习它吧!

疑问:关于使用Validator框架后,显示错误信息的问题。

 我发现:使用Validator框架后,

只能使用<html:errors/>显示错误信息,

不能使用诸如:<html:errors property="error1"/>显示指定的错误信息。

我现在需要这样显示错误,

比如:用户名没有填写的话,只在用户名旁边显示错误信息;

如果Email填写不符合标准,只在Email旁边显示错误信息。

我不希望把所有错误都一起显示出来。

可以用Validator实现吗?

因为我不知道如何实现那个目的,

所以,只好把验证的部分放到ActionForm的validate方法中,

这样就可以指定每一个不同的错误信息,以便在错误页面按要求显示了。

可是,每个验证逻辑都需要自己来写,

org.apache.struts.validator.FieldChecks这个类是Validator框架使用的验证类,

里面有很多现成的方法,由于我没有使用这个框架,

所以就无法使用这些现成的方法了(也可能是我不知道如何使用)。

我想知道:有没有现成的验证方法可以下载到?

例如必填、合法日期、合法Email等等。

请前辈指点。

开始Struts的日记。

今天终于对《Jakarta Struts编程》看了一个大概,

准备搭建一个环境进行进一步学习。

我将下载的status-1.2.7.tar.gz解压缩后,

把lib目录中的status.jar、jstl.jar和standard.jar拷贝到了WEB-INF的lib目录中,

起动服务器后,竟然一个劲儿的抛出异常,

郁闷死……

最后,把所有的jar文件都拷贝到WEB-INF的lib目录后,

才解决了问题。

回过头再看书,才发现,

书上已经写的很明白了,只怪当时没有注意到。

看来,看书还是要仔细一些。

又或是,水平不够,所以注意不到书上说的内容的重要性。