天天看點

python手記(5) PostgreSQL pg_hba.conf 檔案

本部落格所有内容是原創,未經書面許可,嚴禁任何形式的轉

http://blog.csdn.net/u010255642

python中文亂碼解決

首先來看Python (command line)環境

先生成unicode字元

>>> ss=u"武器"

>>> ss

u'\u6b66\u5668'

>>> sss=u'武器'

>>> sss

u'\u6b66\u5668'

>>>

然後是普通字元

>>> s="武器"

>>> s

'\xce\xe4\xc6\xf7'

>>>

出現了中文亂碼

我們通過print語句可以将它們輸出,但問題仍沒有解決

>>> print s

武器

>>> print ss

武器

>>> print sss

武器

判斷字元串的類型是否為unicode類型

>>> isinstance( s, str )

True

>>> isinstance( s, unicode)

False

>>>

decode的作用是将其他編碼的字元串轉換成unicode編碼,如str1.decode('gb2312'),表示将gb2312編碼的字元串str1轉換成unicode編碼。

encode的作用是将unicode編碼轉換成其他編碼的字元串,如str2.encode('gb2312'),表示将unicode編碼的字元串str2轉換成gb2312編碼。

我們先處理非unicode字元,解碼為utf-16格式,也可以解碼成gbk格式

>>> x=s.decode('gbk')

>>> x

u'\u6b66\u5668'

>>> s

'\xce\xe4\xc6\xf7'

>>> s.decode("utf-16")

u'\ue4ce\uf7c6'

>>>

 >>> print x

武器

此外可以使用形如下面的unicode函數來轉換

unicode(s, "gbk")

>>> x=unicode(s,'gbk')

>>> x

u'\u6b66\u5668'

>>> print x

武器

在ubuntu上安裝PostgreSQL

sudo apt-get install -y postgresql-9.1postgresql-client-9.1 postgresql-contrib-9.1postgresql-server-dev-9.1

PostgreSQL登入(使用psql用戶端登入)

使用postgres 使用者登入的意思

 sudo -u postgres psql       

PostgreSQL資料預設會建立一個postgres的資料庫使用者作為資料庫的管理者,密碼是随機的,是以這裡設定為'postgres'

修改PostgreSQL登入密碼:

postgres=# ALTER USERpostgres WITH PASSWORD 'postgres';

         //postgres=#為PostgreSQL下的指令提示符

        4.退出PostgreSQLpsql用戶端

        postgres=# \q

修改linux系統的postgres使用者的密碼(密碼與資料庫使用者postgres的密碼相同)

删除和修改PostgreSQL使用者密碼

sudo passwd -d postgres

PostgreSQL資料預設會建立一個linux使用者postgres,修改密碼

sudo -u postgres passwd

輸入新的 UNIX 密碼:

重新輸入新的 UNIX 密碼:

passwd:已成功更新密碼

在資料庫伺服器上用postgres帳号通過psql或者pgAdmin等等用戶端操作資料庫了。

/etc/init.d/postgresql restart

檔案系統級别備份(冷備份)

檔案系統級别的備份是冷備份,需要停止資料庫。

1 ,停止資料庫

pg_ctl –D /usr/local/pgsql/data stop

2 ,備份資料庫

tar –jcv –f /usr/local/pgsql/backup/filesystem.tar.bz2 /usr/local/pgsql/data/

3 ,删除 /usr/local/pgsql/data/ 目錄

rm –r /usr/local/pgsql/data/

4 ,解壓備份檔案到原目錄

tar –jxv –f /usr/local/pgsql/backup/filesystem.tar.bz2 –C /

5 ,啟動資料庫

pg_ctl –D /usr/local/pgsql/data start

6 ,檢視資料庫 pg1 是否恢複

psql pg1

pg=# select * from tb1;

a

---

1

(1 rows)

PostgreSQL pg_hba.conf 檔案

pg_hba.conf是設定通路認證的主要檔案,格式為每條記錄一行,每行指定一條通路認證。設定一條通路認證包含了7個部分:連接配接方式(type)、資料庫(database)、使用者名(user)、ip位址(ip-address)、子網路遮罩(ip-mask)、認證方法(authentication method)、認證配置(authentication-option),以下是這7個部分的詳細說明: 

連接配接方式(type) 

連接配接方式共有三種:local、host、hostssl 

local 

這條記錄比對通過 Unix 域套接字進行的聯接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯接。 

host 

這條記錄比對通過 TCP/IP 網絡進行的聯接嘗試,請注意,除非伺服器是 帶着 -i 選項或者打開了 postgresql.conf 裡面的 tcpip_socket 配置參數集啟動的,否則 TCP/IP 聯接是被禁止掉的。 

hostssl 

這條記錄比對通過在 TCP/IP 上進行的 SSL 聯接企圖, host 記錄可以比對 SSL 和非 SSL 的聯接企圖, 但 hostssl 記錄需要 SSL 聯接。 

資料庫(database) 

  聲明記錄所比對的資料庫。值 all 表明該記錄比對所有資料庫, 值 sameuser表示如果被請求的資料庫和請求的使用者同名,則比對。 samegroup 表示請求的使用者必須是一個與資料庫同名的組中的成員。 在其他情況裡,這就是一個特定的 PostgreSQL 的名字。 我們可以通過用逗号分隔的方法聲明多個資料庫。 一個包含資料庫名的檔案可以 通過對該檔案字首 @ 來聲明.該檔案必需和 pg_hba.conf 在同一個目錄。 

使用者名(user) 

  為這條記錄聲明所比對的 PostgreSQL 使用者,值 all 表明它比對 于所有使用者。否則,它就是特定 PostgreSQL 使用者的名字,多個使用者名可以通過用逗号分隔的方法聲明,組名字 可以通過用 + 做組名字字首來聲明。一個包含使用者名的檔案可以 通過在檔案名前面字首 @ 來聲明,該檔案必需和 pg_hba.conf 在同一個目錄。 

ip位址(ip-address)、子網路遮罩(ip-mask) 

這兩個字段包含标準的點分十進制表示的 IP位址/掩碼值。 (IP位址隻能用數字的方式聲明,而不能用域名或者主機名)它們倆放在一起,聲明了這條記錄比對的客戶機的 IP 位址。 準确的邏輯是:(actual-IP-address xor IP-address-field) and IP-mask-field 對于要比對的記錄必需為零。如果連接配接方式是host或者hostssl的話,這兩項必須指定,否則可以不填。 

認證方法(authentication method) 

trust 

無條件地允許聯接,這個方法允許任何可以與PostgreSQL 資料庫聯接的使用者以他們期望的任意 PostgreSQL 資料庫使用者身份進行聯接,而不需要密碼。 

reject 

聯接無條件拒絕,常用于從一個組中"過濾"某些主機。 

md5 

要求用戶端提供一個 MD5 加密的密碼進行認證,這個方法是允許加密密碼存儲在pg_shadow裡的唯一的一個方法。 

crypt 

類似 md5 方法,隻是用的是老式的 crypt 加密認證, 用于 7.2 以前的用戶端,對于 7.2 以及以後的用戶端,我們建議使用 md5。 

password 

和"md5"一樣,但是密碼是以明文形式在網絡上傳遞的,我們不應該在不安全的網絡上使用這個方式。 

krb4 

用 Kerberos V4 認證使用者,隻有在進行 TCP/IP 聯接的時候才能用。(譯注:Kerberos,"克爾波洛斯",故希臘神話冥王哈得斯的多頭看門狗。Kerberos 是 MIT 開發出來的基與對稱加密算法的認證協定和/或密鑰 交換方法,其特點是需要兩個不同用途的伺服器,一個用于認證身份, 一個用于通道兩端使用者的密鑰交換。同時 Kerberos 對網絡時間同步 要求比較高,以防止回放攻擊,是以通常伴随 NTP 服務。) 

krb5 

用 Kerberos V5 認證使用者.隻有在進行 TCP/IP 聯接的時候才能用。(譯注:Kerberos V5 是上面 V4 的改良,主要是不再依賴 DES 算法, 同時增加了一些新特性。) 

ident 

擷取客戶的作業系統名(對于 TCP/IP 聯接,使用者的身份是通過與運作在用戶端上的 ident 伺服器聯接進行判斷的,對于本地聯接,它是從作業系統擷取的。) 然後檢查一下,看看使用者是否允許以要求的資料庫使用者進行聯接, 方法是參照在 ident 關鍵字後面聲明的映射。 

如果你使用了 sameuser 映射,那麼假設使用者名 是相等的。如果沒有聲明這個關鍵字,則在 $PGDATA/pg_ident.conf 檔案中找出映射名。如果這個檔案裡包含一條記錄辨別着ident提供的使用者名 和請求的 PostgreSQL 使用者名的映射, 那麼聯接被接受。 

對于本地聯接,隻有在系統支援Unix域套接字信任證的情況下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。 

pam 

使用作業系統提供的可插入的認證子產品服務 (Pluggable Authentication Modules)(PAM)來認證。 

認證配置(authentication-option) 

host    
all         all         192.168.1.0/24        md5
這行的意思是允許所有 192.168.1.***       

postgresql.conf,

因為pg預設是隻監聽本地的請求,是以要将listen_address='*','*'是監聽所有的,‘localhost’是監聽本地

python連接配接pgsql資料庫,print中文亂碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import psycopg2
myi=[]
conn= psycopg2.connect("user=stdmsg dbname=std_msg password=myhasplcsdn") 
cur = conn.cursor() 
cur.execute('SELECT * FROM students') 
rows = cur.fetchall()
for i in rows:
    myi=i;
cur.close() 
conn.commit() 
conn.close() 
class DeepFuture:         
    def blogurlshow(self):
        #處理unicode字元,解決在WIN下的print亂碼
        for ii in myi:
            if isinstance(ii,str):
                print unicode(ii,'utf-8')
            else:
                print ii
    def mynameshow(self):
        print "http://blog.csdn.net/u010255642"
    def buttonpress(self,widget, data):
        if data=="blog":
            self.blogurlshow()
        else:
            self.mynameshow()                    
    def delwin_event(self,widget,event,data=None):
        #如果你在"delete_event"信号進行中,傳回FALSE,GTK會繼續發射這個信号,以供destroy,否則傳回TRUE,表示這個信号已經被處理,不需要再處理了,也不需要再發射這個信号了,這意味着你不能destroy視窗。
        print("delete event!")
        return False
    def destroy_win(self,widget,data=None):
        #視窗銷毀處理
        print("destroy event!")        
        gtk.main_quit()
    def __init__(self):
        #建立一個新視窗
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("2個按鈕的視窗")
        #放入一個不可見的box,然後在裡面放2個按鈕,并設定回調
        self.buttonbox = gtk.HBox(False, 0)
        self.window.add(self.buttonbox) 
        self.blogbutton = gtk.Button("記錄")
        self.namebutton = gtk.Button("部落格")        
        self.blogbutton.connect("clicked", self.buttonpress, "blog")
        self.namebutton.connect("clicked", self.buttonpress, "name") 
        #加入box
        self.buttonbox.pack_start(self.blogbutton, True, True, 0)   
        self.buttonbox.pack_start(self.namebutton, True, True, 0)  
        #顯示
        self.blogbutton.show()
        self.namebutton.show()
        self.buttonbox.show()  
        #指定視窗信号與相關處理事件
        self.window.connect("delete_event", self.delwin_event)			
        self.window.connect("destroy", self.destroy_win)
        self.window.set_border_width(15)
        #顯示視窗
        self.window.show()
    def main(self):
        gtk.main()
if __name__ == "__main__":	
	deep=DeepFuture()
	deep.main()
           

下面是這個示例程式的輸出

1

張三

22

1

1

1

http://blog.csdn.net/u010255642

delete event!