Python sqlAlchemy通过混合属性访问blob?
我正在尝试向sqlAlchemy表中添加一个文本块,我希望对其进行压缩以节省空间。通过各种各样的答案,我得出了我认为应该有效,但不可行的结论。我正在使用sqlite数据库 更新:有人指出我试图在sqlite上使用mysql,但我不知道发生了什么。我改为使用zlib,它在一定程度上起作用,这给了我一个我不理解的新错误Python sqlAlchemy通过混合属性访问blob?,python,sqlalchemy,Python,Sqlalchemy,我正在尝试向sqlAlchemy表中添加一个文本块,我希望对其进行压缩以节省空间。通过各种各样的答案,我得出了我认为应该有效,但不可行的结论。我正在使用sqlite数据库 更新:有人指出我试图在sqlite上使用mysql,但我不知道发生了什么。我改为使用zlib,它在一定程度上起作用,这给了我一个我不理解的新错误 # proper imports and stuff to make this work from sqlalchemy import func class Data(Base):
# 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:与数据关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“decode”
这样做很好
r = session.query(Data).filter(Data.id.like(2)).first()
print r.text
我还查看了文本_blobbed,它是一个set()。我可以做到这一点:
r = session.query(Data.text_blobbed.filter( ... ).first()[0].decode("zlib")
print r
但是如果我将[0]移动到
...
return self.text_blobbed[0].decode("zlib")
和查询:
r = session.query(Data.text).filter( ... ).first()
我得到一个错误:
NotImplementedError:此表达式不支持运算符“getitem”
所以,我还是有点困惑
我一直在看这些东西:
并且似乎是MySQL函数。您似乎正在使用SQLite。如果您打算使用SQLite,您可以在Python端使用它进行压缩和解压缩。在这种情况下,您可能需要一个@IljaEverilä与您的第一个评论,我没有意识到我正在寻找mysql的唯一选项。这让我开始关注zlib编码/解码,它将数据输入sqlite数据库。是的,它需要是一个sqlite,因为我没有运行任何类型的mysql服务器或后端,这基本上是一个测试。不幸的是,直接查询数据时失败。text的AttributeError既不是“InstrumentedAttribute”对象,也不是与数据关联的“Comparator”对象。text_blobbed的属性是“decode”,但更接近。只对数据执行查询,然后转到Data.text即可。