Невозможно отфильтровать Hybrid_property в модели SQLAlchemy из-за значения InstrumentedAttribute (вместо фактического зPython

Программы на Python
Ответить
Anonymous
 Невозможно отфильтровать Hybrid_property в модели SQLAlchemy из-за значения InstrumentedAttribute (вместо фактического з

Сообщение Anonymous »

В базе данных, с которой я работаю, есть несколько столбцов, которые были зашифрованы перед сохранением. Данные сохраняются в формате JSON с одноразовым номером и зашифрованными данными:
т.е.

Код: Выделить всё

# This is what's stored in the DB
{
"nonce": "abcdefg",
"data": "wefgsafawfasdadsfsa"
}
Таблица My SQLAlchemy User настроена для обработки этих зашифрованных данных как гибридного_свойства, где она расшифровывает и возвращает фактическое значение открытого текста при доступе:
Таблица My SQLAlchemy User настроена для обработки этих зашифрованных данных как гибридного_свойства, где она расшифровывает и возвращает фактическое значение открытого текста при доступе:
Таблица My SQLAlchemy User настроена для обработки этих зашифрованных данных как гибридного_свойства, где она расшифровывает и возвращает фактическое значение открытого текста при доступе:
Таблица My SQLAlchemy User настроена для обработки этих зашифрованных данных как гибридного_свойства, где она расшифровывает и возвращает фактическое значение открытого текста при доступе:
Таблица My SQLAlchemy User р>

Код: Выделить всё

import json
from encryption_lib import decrypt

class User(Model):
__tablename__ == "user"

id = Column(Integer, primary_key=True)
_private1 = Column("private1", Text)
_private2 = Column("private2", Text)

@hybrid_property
def private1(self):
json_data = json.loads(self._private1)
nonce = json_data["nonce"]
data = json_data["data"]
return decrypt(nonce, data)    # Decrypt the value so the application can use it when queried

@private1.setter
def private1(self, encrypted):
nonce = encrypted[0]
data = encrypted[1]
self._private1 = json.dumps({"nonce": nonce, "data": data})    # Save the pre-encrypted value to database

# private2 is set up the same way as above
Однако, когда я пытаюсь отфильтровать запрос с помощью ilike или даже использовать встроенную функцию, запрос выдает исключение:

Код: Выделить всё

# ilike (errors)
db.session.query(User).filter(User.private1.ilike(f"%{searchterm}%")).all()

# func.sum (errors)
db.session.query(func.sum(User.private2)).scalar()
TypeError: объект JSON должен быть строкой, байтами или байтовым массивом, а не InstrumentedAttribute

Проблема в том, что sqlalchemy возвращает User.private1 как InstrumentedAttribute вместо фактической строки шифрования из базы данных, поэтому при запуске json.loads() происходит сбой, поскольку данные является на самом деле это не JSON.
Как мне выполнить поиск по этим гибридным свойствам с помощью ilike и func?

Подробнее здесь: https://stackoverflow.com/questions/793 ... edattribut
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»