sqlAlchemy通过混合属性来访问blob?

时间:2018-05-09 19:11:05

标签: python sqlalchemy

我正在尝试将一个文本块添加到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

0 个答案:

没有答案