Postgresql在Linux下的安装配置与C程序应用
Relief
|
1#
Relief 发表于 2008-07-20 15:39
Postgresql在Linux下的安装配置与C程序应用
作者:编网天下
(1)从www.postgresql.org下载pgadmin3-1.6.2.zip 和 postgresql-8.2.3.tar.gz 前者是windows下管理端的安装包,后者是数据库的源码安装包。 (2)将postgresql-8.2.3.tar.gz拷贝指linux系统的一个临时目录中,解压缩 tar -zxvf postgresql-8.2.3.tar.gz 然后进入解压缩后的目录, cd postgresql-8.2.3 进行安装配置: #./configure 这样配置下来数据库将会安装到默认位置/usr/local/pgsql/下 #gmake 没有任何问题的话,我们可以看到最后一句提示信息 “All of PostgreSQL successfully made. Ready to install.” #gmake install 成功安装后能看到最后一句提示信息"PostgreSQL installation complete." cd /usr/local/ ls 我们能看到pgsql目录,里面有安装好的包 (3) 安装后环境设置: 用户组添加: #groupadd postgresql #useradd -g postgresql postgresql 这时在/home目录下已经生成了postgresql目录,接着进行环境变量和profile的 修改 #cd /home/postgresql #vi .bash_profile 在文件尾添加 export PATH=$PATH:/usr/local/pgsql/bin export MANPATH=$MANPATH:/usr/local/pgsql/man export LD_LIBRARYPATH=$LD_LIBRARYPATH:/usr/local/pgsql/lib 然后保存退出。 创建数据库目录和日志目录 mkdir /usr/local/pgsql/data mkdir /usr/local/pgsql/log touch /usr/local/pgsql/log/pgsql.log 改变属主: chown -R postgresql:postgresql /usr/local/pgsql/data chown -R postgresql:postgresql /usr/local/pgsql/log chown -R postgresql:postgresql /usr/local/pgsql/log/pgsql.log (4):初始化数据库并建立数据库和用户 su - postgresql initdb -D /usr/local/pgsql/data 现在就可以启动数据库了 #pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/pgsql.log start 提示“server starting” 然后我们执行进程察看命令查看服务是否已经启动: [postgresql@localhost ~]$ ps -A | grep postgres 19932 pts/1 00:00:00 postgres 19934 ? 00:00:00 postgres 19935 ? 00:00:00 postgres 说明数据库服务已经启动。 创建数据库 [postgresql@localhost ~]$ createdb psmp 提示"CREATE DATABASE" 创建用户 [postgresql@localhost ~]$ createuser -sADEP psmpAdmin Enter password for new role: Enter it again: Shall the new role be allowed to create more new roles? (y/n) y 提示"CREATE ROLE" 其中-s 表示超级用户 我们设置密码为psmpPass 访问数据库 [postgresql@localhost ~]$ psql -d psmp -U psmpAdmin 然后就可以运行SQL语句了,比如select或者insert之类 (5):接下来在windows上安装pgadmin1.6.2,也就是第一个包解压缩的EXE程序,这个比较简单。 当padmin安装完成后,你可能会急着去用这个管理工具连接后台的数据库,可是你一定会遇到连接失败的问题,因为还有一些东西需配置 cd /usr/local/pgsql/data/目录下 可以看到有2个文件需要修改:pg_hba.conf 和 postgresql.conf 修改postgresql.conf 文件中listen_address为"*"并去掉前面的#注视符,对于有些版本的 数据库,比如我实用的7.4.16,只需要去掉tcpip_socket = true 和 port = 5432 前面的注视符,好了,保存;修改pg_hba.conf文件,在 # IPv4-style local connections: host all all 127.0.0.1 255.255.255.255 trust 下添加一行 host all all 192.168.1.3 255.255.0.0 trust 假如你的windows系统的IP为192.168.1.3 然后pg_ctl -D /usr/local/pgsql/data reload 重新加载配置 这时就可以从pgadmin连接进来了。 (6)C程序应用 建立一个序列数s_id CREATE SEQUENCE s_id INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 20 CACHE 1; ALTER TABLE s_id OWNER TO postgresql; 和一个表test: CREATE TABLE test ( id integer NOT NULL, name character varying NOT NULL, age integer NOT NULL, CONSTRAINT test_pkey PRIMARY KEY (id) ) WITH OIDS; ALTER TABLE test OWNER TO postgresql; C代码例子如下: 引用://test.cpp#include "libpq-fe.h" #include #include using namespace std; static void exit_nicely(PGconn *conn) { PQfinish(conn); exit(1); } int main() { int i, nFields, j; struct pg_conn * conn = 0; PGresult *res = 0; conn = PQsetdbLogin("192.168.1.4", "5432", "", "", "postgresql", "postgresql", "postgresql"); if(PQstatus(conn) != CONNECTION_OK) { printf("connect fail \n"); }else { printf("connect success\n"); } res = PQexec(conn, "BEGIN"); if(PQresultStatus(res) != PGRES_COMMAND_OK) { printf("execute sql fail %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } PQclear(res); for(i = 0; i < 10; i++) { res = PQexec(conn, "insert into test(select nextval('s_id'), 'dog', 3)"); PQclear(res); } res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from test where name = 'dog'"); //res = PQexec(conn, "select * from test where name = 'duanjigang'"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { printf("DECLARE CURSOR failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } PQclear(res); res = PQexec(conn, "FETCH ALL in myportal"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { printf("FETCH ALL failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } nFields = PQnfields(res); for (i = 0; i < nFields; i++) printf("%-15s", PQfname(res, i)); printf("\n\n"); for (i = 0; i < PQntuples(res); i++) { for (j = 0; j < nFields; j++) printf("%-15s", PQgetvalue(res, i, j)); printf("\n"); } PQclear(res); res = PQexec(conn, "delete from test where name = 'dog'"); PQclear(res); res = PQexec(conn, "CLOSE myportal"); PQclear(res); res = PQexec(conn, "END"); PQclear(res); PQfinish(conn); return 0; } Makefile #!/bin/sh default: g++ -c test.cpp -I /usr/local/pgsql/include/ g++ -o test test.o -L/usr/local/pgsql/lib -lpq clean: rm -fr test test.o |