我将腌制对象存储在 PostgreSQL 数据库中。最初我认为这是一个坏主意,但它们很少被访问,并且从我所学到的显然 TOAST 使得在关系数据库中存储大 blob 的性能影响最小。
当你INSERT
或UPDATE
一bytea
列它很简单。只需构造 apsycopg2.Binary
并将其传递给execute
游标对象上的调用。就我而言,它是一个腌制的物体。
每当您执行 aSELECT
并取回一bytea
列时,您都会得到一个 pythonbuffer
对象。换句话说,你不能只做 apickle.loads
或 a pickle.load
。我想出的最好的方法是使用StringIO
import psycopg2
import cPickle as pickle
import cStringIO as StringIO
conn = psycopg2.connect(user='postgres',database='postgres')
cur = conn.cursor()
cur.execute('Select %s', (psycopg2.Binary(pickle.dumps({'foo':'bar'},-1)), ))
result, = cur.fetchone()
cur.close()
conn.rollback()
result = StringIO.StringIO(result)
print pickle.load(result)
这样做的代价是什么?StringIO
对象只是原始对象的浅拷贝吗buffer
?有没有更实用的方法来做到这一点?
如果重要的话,我正在使用 Stackless 2.7.5。