psycopg2筆記


建立連接

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

創建數據表

過程:

  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被調用,事務才結束。

  2. 一個簡單的select語句可能會開啟一個事務並且對相應的表格加鎖,所以如果你是在開發一個長時間運行的應用,而且一個連接長時間不使用,那么你需要調用commit或者rollback方法結束事務,避免不必要的問題。

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

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

調用存儲過程

  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. 以下這個例子演示了二進制數據的存取。

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

查詢數據

  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來獲得刪除的行數目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM