我正在尝试将一个文本块添加到sqlAlchemy表中,我想压缩它以节省空间。通过各种答案,我想出了我认为应该工作的东西,但事实并非如此。我正在使用sqlite数据库。
更新:有人指出我试图在sqlite上使用mysql,我不知道发生了什么。我调整了使用zlib而且它在一定程度上工作,这给了我一个我不理解的新错误。
# proper imports and stuff to make this work
from sqlalchemy import func
class Data(Base):
__tablename__ = 'data'
# ...
text_blobbed = Column('text', BLOB)
@hybrid_property
def text(self):
# return func.decompress(self.text_blobbed)
return self.text_blobbed.decode("zlib")
@text.setter
def text(self, stuff):
# self.text_blobbed = func.compress(stuff)
self.text_blobbed = stuff.encode("zlib")
来自func的旧错误。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such function: compress [SQL: ...... ]
我现在可以通过Data.text =“一个非常大的文本块”添加文本
但是当我去查询这个时候
session.query(Data.text).filter(Data.id.like(2)).first()
我收到错误: AttributeError:与“Data.text_blobbed”关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“decode”
这样做很好。
r = session.query(Data).filter(Data.id.like(2)).first()
print r.text
我还查看了text_blobbed,它是一个set()。我可以这样做:
r = session.query(Data.text_blobbed.filter( ... ).first()[0].decode("zlib")
print r
但是如果我将[0]移动到
的hybrid_property中...
return self.text_blobbed[0].decode("zlib")
和查询:
r = session.query(Data.text).filter( ... ).first()
我收到错误: NotImplementedError:此表达式
不支持运算符'getitem'所以,我有点困惑。
我一直在看这些事情:
SQLAlchemy - Writing a hybrid method for child count
mysql Compress() with sqlalchemy
SELECT UNCOMPRESS(text) FROM with sqlalchemy
http://docs.sqlalchemy.org/en/latest/orm/mapped_sql_expr.html?highlight=descriptor