psycopg2笔记
建立连接
- 使用*.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来获得删除的行数目。