postgre 配置與連接代碼

(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;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章