(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
可能在鏈接或者運行時提示不能打開libpq這個庫,你需要修改/etc/ld.so.conf文件,並在中添加/usr/local/pgsql/lib,然後執行ldconfig命令,再次運行./test就能看到sql語句的數出了
具體的文檔可以去CU的中文文檔察看,postgresql安裝包doc中也有詳細的說明。
/////////////////////////////////////////////////////////////連接與執行代碼/////////////////////////////////////////////////
/***************************************************************************
* Copyright (C) 2005 by 北京寬廣電信高技術發展有限公司
*
* PROJ. NAME : TMA
* DATE : 2006/10/24
* VERSION : 1.0
* AUTHOR : Longlimei
* DESCR. :
* MODIFY HISTORY :
*
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include "moduleintf.h"
#include "pqCopy.h"
//#include "UtilityFunc.h"
//#include "logmsg.h"
extern char pDBServer[128];
extern char g_strDBName[128];
extern char pDBUser[128];
extern char pDBPwd[128];
extern int g_nClientEncoding;
// char pDBServer[STR_LEN+1];
// char g_strDBName[STR_LEN +1];
// char pDBUser[STR_LEN+1];
// char pDBPwd[STR_LEN+1];
// int g_nClientEncoding;
using namespace std;
void getIpString(const unsigned long &host, char *pTmp)
{
char *p = NULL;
struct in_addr struAddr ;
struAddr.s_addr = host;
p = inet_ntoa(struAddr);
strncpy(pTmp, p, 63);
}
/**************************************************
* 功能: 建立DB的連接
* 參數:
* 返回:
* 說明:
* ************************************************/
PGconn* connectDB(unsigned long host, unsigned short port,
char *pDatabase, char *pUID, char *pPWD, unsigned short timeout)
{
int IntTemp;
char command[128] = {0};
char conninfo[128];
char *pStrError = NULL;
PGresult *res = NULL;
//construct conninfo
char pTmp[64]={0};
char *pIP = NULL;
if (host == 0)
{
pIP = pDBServer;
}
else
{
getIpString(host, pTmp); // 1?
pIP = pTmp;
}
if (0 == port)
sprintf(conninfo, "hostaddr=%s port=5432", pIP);
else
sprintf(conninfo, "hostaddr=%s port=%d", pIP, port);
strcat(conninfo, " dbname=");
if (NULL != pDatabase)
strcat(conninfo, pDatabase);
else
strcat(conninfo, g_strDBName);
strcat(conninfo, " user=");
if (NULL != pUID)
strcat(conninfo, pUID);
else
strcat(conninfo, pDBUser);
strcat(conninfo, " password=");
if (NULL != pUID)
strcat(conninfo, pPWD);
else
strcat(conninfo, pDBPwd);
strcat(conninfo, " connect_timeout=");
sprintf(pTmp, " %d", timeout);
strcat(conninfo, pTmp);
//open connection to db
PGconn* conn = PQconnectdb(conninfo);
IntTemp = PQstatus(conn);
if (IntTemp != CONNECTION_OK)
{
pStrError = PQerrorMessage(conn);
LOG( conninfo);
LOG( pStrError);
// 2012-02-16 釋放資源
if(NULL != conn)
{
PQfinish(conn);
}
conn = NULL;
goto FUNCTION_EXIT;
}
if (g_nClientEncoding == CHAR_ENCODING_UTF8)
strcpy(command, "set client_encoding = 'UTF8';");
else
strcpy(command, "set client_encoding = 'GBK';");
res = PQexec(conn, command);
PQclear(res);
FUNCTION_EXIT:
return conn;
}
/**************************************************
* 功能: 建表
* 參數:
* pDBconn : I,DB連接。若爲NULL,則臨時建立連接。如果是外部提供的,則由外部負責釋放
* ulDBServer: I, DB的IP地址
* pDBName : I, DB的數據庫名
* pSQL : I, sql to execute
* 返回:
* 說明:
* ************************************************/
PQCopyRsltEnum executeSQL(PGconn* pDBconn, unsigned long ulDBServer, char *pDBName, char *pSQL)
{
PQCopyRsltEnum EnumFailed = PQCOPY_FAILED_OTHER;
bool BoolOwn = false;
PGconn *pConn = pDBconn;
PGresult *res = NULL;
if(NULL == pConn)
{
BoolOwn = true;
pConn = connectDB(ulDBServer, 0, pDBName);
}
if(NULL == pConn)
{
EnumFailed = PQCOPY_FAILED_CONN;
goto FUNCTION_EXIT;
}
res = PQexec(pConn, pSQL);
if ( PQresultStatus(res) != PGRES_COMMAND_OK ) // 成功完成一個不返回數據的命令
{
EnumFailed = PQCOPY_FAILED_EXEC;
goto FUNCTION_EXIT;
}
EnumFailed = PQCOPY_SUCCESS;
FUNCTION_EXIT:
if ( (NULL != pConn) && (PQCOPY_SUCCESS != EnumFailed) )
{
char *pStrError = PQerrorMessage(pConn);
LOG( pSQL);
LOG( pStrError);
}
if ( NULL != res )
{
PQclear(res);
}
if(NULL != pConn && BoolOwn)
{
PQfinish(pConn);
}
return EnumFailed;
}