sqlAlchemy для доступа к BLOB через гибридные свойства? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь добавить блок текста в таблицу sqlAlchemy, которую я хочу сжать, чтобы сэкономить место на нем. Просматривая различные ответы, я пришел к выводу, что, по моему мнению, должно работать, но это не так. Я работаю с базой данных sqlite.

Обновлено: было указано, что я пытался использовать mysql на sqlite, но я не знал, что именно так и происходит. Я настроен на использование 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: Ни объект «InstrumentedAttribute», ни объект «Comparator», связанный с Data.text_blobbed, не имеют атрибута «decode»

Делать это хорошо.

r = session.query(Data).filter(Data.id.like(2)).first()
print r.text

Я также посмотрел на text_blobbed, который является множеством (). И я могу сделать это, что работает:

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 - Написание гибридного метода для подсчета детей

mysql Compress () с sqlalchemy

ВЫБРАТЬ НЕКОМПРЕСС (текст) ОТ с sqlalchemy

http://docs.sqlalchemy.org/en/latest/orm/mapped_sql_expr.html?highlight=descriptor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...