psycopg2筆記

創建鏈接

  1. 使用*.ini文件(python的configparser包能夠解析這種類型的配置文件)保存數據庫鏈接的配置信息。
  2. 使用psycopg2.connect函數得到connection對象。
  3. 使用connection對象建立cursor對象。
  4. 使用cursor對象執行sql語句提交或者回滾transaction。
  5. 使用cursor對象fetchone得到查詢結果。
  6. 關閉cursor對象和connection對象。

建立數據表

過程:python

  1. 構造建表的sql語句
  2. 調用psycopg2.connect()方法得到connection對象
  3. 調用connection.cursor()方法得到cursor對象
  4. 調用cursor.execute()方法執行sql語句
  5. 調用connection.commit方法提交事務
  6. 調用cursor.close()和connection.close()方法關閉鏈接

插入行

  1. 構造插入語句, 使用%s做爲佔位符,執行時psycopg2會用值智能替換掉佔位符。能夠添加RETURNING字句,來獲得自動生成的字段值。
  2. 建立數據表的2,3。得到connection對象和cursor對象
  3. 使用cursor.execute方法來插入一行,使用cursor.executemany方法來插入多行。 execute方法的第一個參數是sql語句,第二個參數是值的tuple。executemany方法的第一個參數是sql語句,第二個參數是list of tuple。
  4. 若是在1中使用了RETURNING子句,可使用cursor.fetchone方法,來得到返回的自動生成字段的值。
  5. 同上5
  6. 同上6

更新數據

  1. 基本上和插入行相同。
  2. 使用cursor.rowcount屬性來得到受影響的行的數目。

transaction

  1. connection對象負責管理事務。當你第一次使用cursor.execute方法執行sql語句的時候事務開啓,這之後的全部sql語句都在這個事務中執行,直到connection.commit或者connection.rollback或者del connection或者connection.close被調用,事務才結束。sql

  2. 一個簡單的select語句可能會開啓一個事務而且對相應的表格加鎖,因此若是你是在開發一個長時間運行的應用,並且一個鏈接長時間不使用,那麼你須要調用commit或者rollback方法結束事務,避免沒必要要的問題。數據庫

  3. 使用connection.autocommit來控制事務函數

  4. 從psycopg2.5開始,connection和cursor都是context manager對象,能夠在with ... as ...語句中使用。值得注意的是,離開with語句後,connection對象不會被close,它只是結束提交或者回滾事務。因此能夠在多個with語句中使用connection對象。post

調用存儲過程

  1. 使用cursor.callproc('function name', tuple), 函數的第一個參數是存儲過程的名字,函數的第二個參數是實參tuple。這個調用和cursor.execute('select * from functionanme(%s)', tuple)相同。
  2. 可使用cursor.fetchone, cursor.fetchmany, cursor.fetchall來得到返回值。

blob對象

  1. 使用psycopg2.Binary對象和postgresql的BYTEA數據類型對應,用於存儲二進制數據。
  2. 如下這個例子演示了二進制數據的存取。fetch

  3. config.pypostgresql

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/')

查詢數據

  1. 查詢數據和其它操做相似。
  2. 可使用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。

刪除數據

  1. 和更新數據相似
  2. 可使用cursor.rowcount來得到刪除的行數目。
相關文章
相關標籤/搜索