在PostgreSQL上安裝并使用擴(kuò)展模塊的教程
安裝模塊
注意: 我的運(yùn)行環(huán)境是 Ubuntu 10.04 和 PostgreSQL 8.4
首先安裝 postgresql-contrib 包并重啟數(shù)據(jù)庫服務(wù)器,然后檢查 contrib 目錄看是否包含一些可用模塊:
sudo apt-get install postgresql-contrib sudo /etc/init.d/postgresql-8.4 restart cd /usr/share/postgresql/8.4/contrib/ ls
然后我們創(chuàng)建一個(gè)名為 module_test 的數(shù)據(jù)庫:
su postgres createdb module_test
然后我們將模塊 chkpass, fuzzystrmatch, isn 和 hstore 應(yīng)用到 module_test 數(shù)據(jù)庫,執(zhí)行下面命令即可:
psql -d module_test -f chkpass.sql psql -d module_test -f fuzzystrmatch.sql psql -d module_test -f isn.sql psql -d module_test -f hstore.sql
接下來,我們來看看每個(gè)模塊是如何使用的。
使用 chkpass
chkpass 模塊引入一個(gè)新的數(shù)據(jù)類型 “chkpass” 這個(gè)類型用來存儲(chǔ)一個(gè)加密的字段,例如密碼。使用方法可以從下面的 SQL 里看到,存入 chkpass 字段的字符串會(huì)自動(dòng)進(jìn)行加密:
CREATE TABLE accounts (username varchar (100), password chkpass); INSERT INTO accounts(username, "password" ) VALUES ( 'user1' , 'pass1' ); INSERT INTO accounts(username, "password" ) VALUES ( 'user2' , 'pass2' );
然后我們可以通過下面的SQL進(jìn)行身份認(rèn)證:
SELECT count (*) from accounts where username= 'user1' and password = 'pass1'
其中 = 操作符使用了 eq(column_name, text) 方法,該方法由 chkpass 模塊提供用于測(cè)試是否相等。chkpass 使用 Unix 的 crypt() 函數(shù),因此加密效果比較弱,該函數(shù)只對(duì)字符串的前8位進(jìn)行加密,只要前8位相同的字符串就被認(rèn)為是相等的。因此不建議在實(shí)際生產(chǎn)環(huán)境中使用 chkpass 模塊,建議使用 pgcrypto 模塊。
使用 fuzzystrmatch
該模塊提供的函數(shù)包括:soundx(), difference(), levenshtein() 和 metaphone() 。soundx() 和 metaphone() 是語音算法,將文本字符串轉(zhuǎn)成基于發(fā)音的代碼字符串。而 difference() 和 levenshtein() 則返回?cái)?shù)值代表兩個(gè)輸入字符串的相似度。
讓我們先看看 levenshtein() 和 metaphone() 函數(shù):
SELECT levenshtein( 'foodlets' , 'booklets' );
該查詢返回 2,很顯然。
metaphone() 函數(shù)需要兩個(gè)參數(shù),一個(gè)是文本字符串,另外一個(gè)是輸出代碼的最大長(zhǎng)度的:
SELECT metaphone( 'foodlets' , 6); SELECT metaphone( 'fudlets' , 6);
如果你試圖獲取兩個(gè)字符串的 Levenshtein 距離,那將返回0:
SELECT levenshtein( 'FTLTS' , 'FTLTS' );
這意味著兩個(gè)字符串發(fā)音類似。
fuzzystrmatch 用在網(wǎng)站實(shí)現(xiàn)搜索功能上是非常有用的,而且可用于實(shí)現(xiàn)拼寫檢查和錯(cuò)誤關(guān)鍵字糾正,相當(dāng)于是 Google 上的“Did you mean...”
使用 isn
該模塊提供了存儲(chǔ)國(guó)際標(biāo)準(zhǔn)數(shù)值的數(shù)據(jù)類型,例如 International Standard Book Numbers (ISBN), International Standard Music Numbers (ISMN), International Standard Serial Numbers (ISSN), Universal Product Codes (UPC), 等等。同時(shí)提供了校驗(yàn)函數(shù)、類型轉(zhuǎn)換函數(shù)等等。
讓我們來測(cè)試存儲(chǔ)圖書信息:
CREATE TABLE books(number isbn13, title varchar (100)) INSERT INTO books( "number" , title) VALUES ( '978-03' , 'Rework' );
INSERT 語句將會(huì)執(zhí)行錯(cuò)誤,因?yàn)檩斎氲淖址皇且粋€(gè)有效的 ISBN 號(hào),而下面的語句就可以正確執(zhí)行:
INSERT INTO books( "number" , title) VALUES ( '978-0307463746' , 'Rework' )
如果要將一個(gè)10位的 ISBN 轉(zhuǎn)成 13 位的,可以使用 isbn13() 函數(shù):
INSERT INTO books( "number" , title) VALUES (isbn13( '0307463745' ), 'Rework' )
使用 hstore
你肯定已經(jīng)聽到很多關(guān)于 NoSQL 以及 key-value 數(shù)據(jù)庫的介紹,使用 hstore 模塊可以讓 PostgreSQL 具備 key-value 存儲(chǔ)的功能。
想象你正在處理一個(gè)表格,你對(duì)表格力列頭的名稱和類型處理沒有任何思路,而 hstore 就可以解決你的問題,hstore 將 key 和 value 都作為文本存儲(chǔ),值可以為 NULL,但 key 不允許。
我們來創(chuàng)建一個(gè)使用 hstore 類型的表,并往表插入一些數(shù)據(jù):
CREATE TABLE kv_data( id integer , data hstore) INSERT into kv_data values (1, hstore( 'name' , 'amit' ) || hstore( 'city' , 'bangalore' )), (2, hstore( 'name' , 'raghu' ) || hstore( 'age' , '26' )), (3, hstore( 'name' , 'ram' ) || hstore( 'age' , '28' ));
你可以創(chuàng)建你自己的 key ,例如 “height”, “favourite_book” 等等,而 || 運(yùn)算符用于級(jí)聯(lián)并列操作。
現(xiàn)在我們已經(jīng)有一個(gè)表和少量測(cè)試數(shù)據(jù),接下來看看怎么做查詢、更改和刪除操作,假設(shè)我們要查詢 city 為 bangalore 的數(shù)據(jù),可以使用如下SQL語句:
SELECT * from kv_data where data-> 'city' = 'bangalore'
要獲取表中的平均年齡可以使用如下語句:
SELECT avg ((data-> 'age' ):: integer ) age from kv_data;
這里的 ::integer 用于將文本數(shù)據(jù)轉(zhuǎn)成整數(shù),以便可以使用數(shù)學(xué)函數(shù)。
要根據(jù)姓名進(jìn)行排序,方法是:
SELECT * from kv_data order by data-> 'name' desc
將所有城市更改為 delhi :
UPDATE kv_data SET data = data || ( 'city' => 'delhi' );
然后刪除 age 這個(gè)鍵:
UPDATE kv_data set data = delete (data, 'age' )
或者刪除名為 amit 的記錄:
DELETE from kv_data where data-> 'name' = 'amit'
雖然這不是一個(gè)真正的 key-value 存儲(chǔ)服務(wù)器,但 hstore 還是提供了做為 NoSQL 數(shù)據(jù)庫足夠的靈活性。
其他有用的模塊
這里還有幾個(gè)你可能會(huì)用到的模塊:
- Pgcrypto 提供了哈希和加密函數(shù),支持 SHA, MD5, Blowfish, AES 等算法
- Citext 增加了大小寫敏感的文本數(shù)據(jù)類型,數(shù)據(jù)使用小寫存儲(chǔ)
- Uuid-ossp 提供了全局唯一標(biāo)示符的函數(shù)
- Pg_trgm 增加了基于 trigram 匹配的字符串查找函數(shù)
相關(guān)文章
免費(fèi)開源數(shù)據(jù)庫:SQLite、MySQL和PostgreSQL的優(yōu)缺點(diǎn)
對(duì)于處理大規(guī)模數(shù)據(jù)和高并發(fā)訪問的場(chǎng)景,MySQL和PostgreSQL更適合,SQLite在小型應(yīng)用程序或嵌入式設(shè)備中是一種輕量級(jí)、簡(jiǎn)單和易于使用的選擇,根據(jù)具體的應(yīng)用需求和場(chǎng)景特點(diǎn),選擇合適的開源關(guān)系型數(shù)據(jù)庫可以提供更好的性能、可擴(kuò)展性和靈活性2024-02-02DBeaver轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫(導(dǎo)出)的詳細(xì)圖文教程
在工作中,我們會(huì)進(jìn)行不同環(huán)境之間數(shù)據(jù)庫的數(shù)據(jù)更新,這篇文章主要給大家介紹了關(guān)于DBeaver轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫(導(dǎo)出)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01DBeaver之如何導(dǎo)出數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)
這篇文章主要介紹了DBeaver之如何導(dǎo)出數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04數(shù)據(jù)庫連接池Druid與Hikari對(duì)比詳解
這篇文章主要為大家介紹了數(shù)據(jù)庫連接池Druid與Hikari對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02最新Navicat?16??Mac版安裝永久激活教程(親測(cè)有效)
這篇文章主要介紹了最新Navicat?16??Mac版安裝永久激活教程(親測(cè)有效),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)Navicat?16?永久激活教程感興趣的朋友一起看看吧2022-08-08高效的數(shù)據(jù)同步工具DataX的使用及實(shí)現(xiàn)示例
這篇文章主要為大家介紹了高效的數(shù)據(jù)同步工具DataX的使用及實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03多種獲取遠(yuǎn)程連接access數(shù)據(jù)庫的方法
多種獲取遠(yuǎn)程連接access數(shù)據(jù)庫的方法...2007-03-03DBeaver執(zhí)行外部sql文件詳細(xì)圖文教程
DBeaver最近才使用,以前使用的PL/SQL,有些不是很熟悉,記錄下來,下面這篇文章主要給大家介紹了關(guān)于DBeaver執(zhí)行外部sql文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06