建立連接
- 使用*.ini文件(python的configparser包可以解析這種類型的配置文件)保存數據庫連接的配置信息。
- 使用psycopg2.connect函數獲得connection對象。
- 使用connection對象創建cursor對象。
- 使用cursor對象執行sql語句提交或者回滾transaction。
- 使用cursor對象fetchone獲得查詢結果。
- 關閉cursor對象和connection對象。
創建數據表
過程:
- 構造建表的sql語句
- 調用psycopg2.connect()方法獲得connection對象
- 調用connection.cursor()方法獲得cursor對象
- 調用cursor.execute()方法執行sql語句
- 調用connection.commit方法提交事務
- 調用cursor.close()和connection.close()方法關閉連接
插入行
- 構造插入語句, 使用%s作為占位符,執行時psycopg2會用值智能替換掉占位符。可以添加RETURNING字句,來得到自動生成的字段值。
- 同創建數據表的2,3。獲得connection對象和cursor對象
- 使用cursor.execute方法來插入一行,使用cursor.executemany方法來插入多行。 execute方法的第一個參數是sql語句,第二個參數是值的tuple。executemany方法的第一個參數是sql語句,第二個參數是list of tuple。
- 如果在1中使用了RETURNING子句,可以使用cursor.fetchone方法,來獲得返回的自動生成字段的值。
- 同上5
- 同上6
更新數據
- 基本上和插入行相同。
- 使用cursor.rowcount屬性來獲得受影響的行的數目。
transaction
-
connection對象負責管理事務。當你第一次使用cursor.execute方法執行sql語句的時候事務開啟,這以后的所有sql語句都在這個事務中執行,直到connection.commit或者connection.rollback或者del connection或者connection.close被調用,事務才結束。
-
一個簡單的select語句可能會開啟一個事務並且對相應的表格加鎖,所以如果你是在開發一個長時間運行的應用,而且一個連接長時間不使用,那么你需要調用commit或者rollback方法結束事務,避免不必要的問題。
-
使用connection.autocommit來控制事務
-
從psycopg2.5開始,connection和cursor都是context manager對象,可以在with ... as ...語句中使用。值得注意的是,離開with語句后,connection對象不會被close,它只是結束提交或者回滾事務。所以可以在多個with語句中使用connection對象。
調用存儲過程
- 使用cursor.callproc('function name', tuple), 函數的第一個參數是存儲過程的名字,函數的第二個參數是實參tuple。這個調用和cursor.execute('select * from functionanme(%s)', tuple)相同。
- 可以使用cursor.fetchone, cursor.fetchmany, cursor.fetchall來獲得返回值。
blob對象
-
使用psycopg2.Binary對象和postgresql的BYTEA數據類型對應,用於存儲二進制數據。
-
以下這個例子演示了二進制數據的存取。
-
config.py
def config():
db_conn_config = {
'host': 'localhost',
'user': 'postgres',
'password': '',
'dbname': 'test',
'port': 5432
}
return db_conn_config
- write_blob.py
import psycopg2
from config import config
def write_blob(path_to_file):
""" insert a BLOB into a table """
conn = None
try:
# read data from a picture
drawing = open(path_to_file, 'rb').read()
# read database configuration
params = config()
# connect to the PostgresQL database
conn = psycopg2.connect(**params)
# create a new cursor object
cur = conn.cursor()
# execute the INSERT statement
cur.execute("INSERT INTO parts_drawings(drawing_data,name) " +
"VALUES(%s,%s)",
(psycopg2.Binary(drawing), path_to_file))
# commit the changes to the database
conn.commit()
# close the communication with the PostgresQL database
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
if __name__ == '__main__':
write_blob('./1.jpg')
- read_blob.py
from config import config
import psycopg2
def read_blob(id, path_to_dir):
""" read BLOB data from a table """
conn = None
try:
# read database configuration
params = config()
# connect to the PostgresQL database
conn = psycopg2.connect(**params)
# create a new cursor object
cur = conn.cursor()
# execute the SELECT statement
cur.execute(""" SELECT *
FROM parts_drawings
WHERE id = %s """,
(id,))
blob = cur.fetchone()
open(path_to_dir + str(blob[0]) + '.jpg', 'wb').write(blob[1])
# close the communication with the PostgresQL database
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
if __name__ == '__main__':
read_blob(1, './img/')
查詢數據
- 查詢數據和其它操作類似。
- 可以使用cursor.fetchone, cursor.fetchall, cursor.fetchmany(size=cursor.arraysize)方法來返回查詢結果。fetchone返回一個tuple或者None, fetchall返回一個list of tuple,如果沒有結果則返回一個空的tuple。fetchmany返回list of tuple, list的長度由size參數決定,size的默認值是cursor.arraysize, 如果沒有結果可以返回,那么返回一個空的list。
刪除數據
- 和更新數據類似
- 可以使用cursor.rowcount來獲得刪除的行數目。