psycopg2是Python編程語(yǔ)言的PostgreSQL數(shù)據(jù)庫(kù)的適配器。postgreSQL屬于關(guān)系型數(shù)據(jù)庫(kù),支持Python通過(guò)DB-API,本文假設(shè)已經(jīng)安裝和配置好了PostgreSQL,要使用psycopg2的模塊,首先必須創(chuàng)建一個(gè)Connection對(duì)象,它表示數(shù)據(jù)庫(kù)然后再可以選擇創(chuàng)建游標(biāo)對(duì)象,這將幫助執(zhí)行的所有SQL語(yǔ)句。
本例中用的操作系統(tǒng)為:
Debian GNU/Linux 8.2 (jessie)12
Python版本為:
Python 2.7.912
psycopg2的安裝
Debian下執(zhí)行以下命令安裝 psycopg2:
apt-get install python-psycopg21
安裝好后,就可以寫Python腳本來(lái)訪問(wèn)PostgreSQL了。
導(dǎo)入psycopg2
想要使用psycopg2,必須用import語(yǔ)句導(dǎo)入該包:
import psycopg21
connection類
connection類表示數(shù)據(jù)庫(kù)連接對(duì)象。由psycopg2.connect()方法創(chuàng)建。
創(chuàng)建connection對(duì)象
psycopg2.connect()函數(shù)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)會(huì)話(Session)并且返回一個(gè)連接對(duì)象。該函數(shù)的參數(shù)為:
dbname – 數(shù)據(jù)庫(kù)名字
user – 數(shù)據(jù)庫(kù)角色名稱
password – 數(shù)據(jù)庫(kù)角色密碼
host – 數(shù)據(jù)庫(kù)地址
port – 端口
connection的主要方法
connection提供了常用的數(shù)據(jù)庫(kù)操作:
commit():提交任何未提交的事務(wù)(transaction)到數(shù)據(jù)庫(kù)。
rollback():回滾。
close():關(guān)閉數(shù)據(jù)庫(kù)。如果關(guān)閉數(shù)據(jù)庫(kù)時(shí)仍有未提交的事務(wù),則執(zhí)行回滾操作。
cursor類
創(chuàng)建cursor對(duì)象
psycopg2提供了一個(gè)cursor類,用來(lái)在數(shù)據(jù)庫(kù)Session里執(zhí)行PostgreSQL命令。cursor對(duì)象由connection.cursor()方法創(chuàng)建:
cur = conn.cursor()1
cursor的主要方法
execute(query, vars=None):執(zhí)行SQL語(yǔ)句。
fetchall():獲取所有查詢結(jié)果,返回值為tuple列表。
有了cursor對(duì)象,就可以操作數(shù)據(jù)庫(kù)了。
建立數(shù)據(jù)庫(kù)連接
conn = psycopg2.connect(dbname="mydb", user="postgres",
password="1234", host="127.0.0.1", port="5432")12
創(chuàng)建表
cur.execute( 'CREATE TABLE Employee ('
'name varchar(80),'
'address varchar(80),'
'age int,'
'date date'
')'
)12345678
插入數(shù)據(jù)
cur.execute("INSERT INTO Employee "
"VALUES('Gopher', 'China Beijing', 100, '2017-05-27')")12
查詢數(shù)據(jù)
cur.execute("SELECT * FROM Employee")
rows = cur.fetchall()for row in rows:
print('name=' + str(row[0]) + ' address=' + str(row[1]) +
' age=' + str(row[2]) + ' date=' + str(row[3]))12345
更新數(shù)據(jù)
cur.execute("UPDATE Employee SET age=12 WHERE name='Gopher'")1
刪除數(shù)據(jù)
cur.execute("DELETE FROM Employee WHERE name='Gopher'")1
完整示例
#coding=utf-8import psycopg2# 連接數(shù)據(jù)庫(kù)conn = psycopg2.connect(dbname="mydb", user="postgres",
password="1234", host="127.0.0.1", port="5432")# 創(chuàng)建cursor以訪問(wèn)數(shù)據(jù)庫(kù)cur = conn.cursor()# 創(chuàng)建表cur.execute( 'CREATE TABLE Employee ('
'name varchar(80),'
'address varchar(80),'
'age int,'
'date date'
')'
)# 插入數(shù)據(jù)cur.execute("INSERT INTO Employee "
"VALUES('Gopher', 'China Beijing', 100, '2017-05-27')")# 查詢數(shù)據(jù)cur.execute("SELECT * FROM Employee")
rows = cur.fetchall()for row in rows:
print('name=' + str(row[0]) + ' address=' + str(row[1]) +
' age=' + str(row[2]) + ' date=' + str(row[3]))# 更新數(shù)據(jù)cur.execute("UPDATE Employee SET age=12 WHERE name='Gopher'")# 刪除數(shù)據(jù)cur.execute("DELETE FROM Employee WHERE name='Gopher'")# 提交事務(wù)conn.commit()# 關(guān)閉連接conn.close()
Python psycopg2 模塊APIs
以下是psycopg2的重要的的模塊例程可以滿足Python程序與PostgreSQL數(shù)據(jù)庫(kù)的工作。如果尋找一個(gè)更復(fù)雜的應(yīng)用程序,那么可以看看Python psycopg2的模塊的官方文檔。
S.N. | API & 描述 |
---|---|
1 | psycopg2.connect(database="testdb", user="postgres", password="cohondob", host="127.0.0.1", port="5432") 這個(gè)API打開(kāi)一個(gè)連接到PostgreSQL數(shù)據(jù)庫(kù)。如果成功打開(kāi)數(shù)據(jù)庫(kù)時(shí),它返回一個(gè)連接對(duì)象。 |
2 | connection.cursor() 該程序創(chuàng)建一個(gè)光標(biāo)將用于整個(gè)數(shù)據(jù)庫(kù)使用Python編程。 |
3 | cursor.execute(sql [, optional parameters]) 此例程執(zhí)行SQL語(yǔ)句?杀粎(shù)化的SQL語(yǔ)句(即占位符,而不是SQL文字)。 psycopg2的模塊支持占位符用%s標(biāo)志 例如:cursor.execute("insert into people values (%s, %s)", (who, age)) |
4 | curosr.executemany(sql, seq_of_parameters) 該程序執(zhí)行SQL命令對(duì)所有參數(shù)序列或序列中的sql映射。 |
5 | curosr.callproc(procname[, parameters]) 這個(gè)程序執(zhí)行的存儲(chǔ)數(shù)據(jù)庫(kù)程序給定的名稱。該程序預(yù)計(jì)為每一個(gè)參數(shù),參數(shù)的順序必須包含一個(gè)條目。 |
6 | cursor.rowcount 這個(gè)只讀屬性,它返回?cái)?shù)據(jù)庫(kù)中的行的總數(shù)已修改,插入或刪除最后 execute*(). |
7 | connection.commit() 此方法提交當(dāng)前事務(wù)。如果不調(diào)用這個(gè)方法,無(wú)論做了什么修改,自從上次調(diào)用commit()是不可見(jiàn)的,從其他的數(shù)據(jù)庫(kù)連接。 |
8 | connection.rollback() 此方法會(huì)回滾任何更改數(shù)據(jù)庫(kù)自上次調(diào)用commit()方法。 |
9 | connection.close() 此方法關(guān)閉數(shù)據(jù)庫(kù)連接。請(qǐng)注意,這并不自動(dòng)調(diào)用commit()。如果你只是關(guān)閉數(shù)據(jù)庫(kù)連接而不調(diào)用commit()方法首先,那么所有更改將會(huì)丟失! |
10 | cursor.fetchone() 這種方法提取的查詢結(jié)果集的下一行,返回一個(gè)序列,或者無(wú)當(dāng)沒(méi)有更多的數(shù)據(jù)是可用的。 |
11 | cursor.fetchmany([size=cursor.arraysize]) 這個(gè)例程中取出下一個(gè)組的查詢結(jié)果的行數(shù),返回一個(gè)列表。當(dāng)沒(méi)有找到記錄,返回空列表。該方法試圖獲取盡可能多的行所顯示的大小參數(shù)。 |
12 | cursor.fetchall() 這個(gè)例程獲取所有查詢結(jié)果(剩余)行,返回一個(gè)列表?招袝r(shí)則返回空列表。 |
連接到數(shù)據(jù)庫(kù)
Python代碼顯示了如何連接到一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)不存在,那么它就會(huì)被創(chuàng)建,最終將返回一個(gè)數(shù)據(jù)庫(kù)對(duì)象。
#!/usr/bin/pythonimport psycopg2 conn = psycopg2.connect(database="testdb", user="postgres", password="pass123", host="127.0.0.1", port="5432")print "Opened database successfully"
在這里,也可以提供數(shù)據(jù)庫(kù)testdb的名稱,如果數(shù)據(jù)庫(kù)成功打開(kāi),那么它會(huì)給下面的消息:
Open database successfully