我将腌制对象存储在 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。