Hybrid_property kann im SQLAlchemy-Modell aufgrund des InstrumentedAttribute-Werts (anstelle des tatsächlichen Werts in Python

Python-Programme
Guest
 Hybrid_property kann im SQLAlchemy-Modell aufgrund des InstrumentedAttribute-Werts (anstelle des tatsächlichen Werts in

Post by Guest »

Die Datenbank, mit der ich arbeite, enthält mehrere Spalten, die vor der Speicherung verschlüsselt wurden. Die Daten werden als JSON mit ihrer Nonce und den verschlüsselten Daten gespeichert:
d. h.

Code: Select all

# This is what's stored in the DB
{
"nonce": "abcdefg",
"data": "wefgsafawfasdadsfsa"
}
Meine SQLAlchemy-Benutzertabelle wurde eingerichtet, um diese verschlüsselten Daten als hybride_Eigenschaft zu verarbeiten, wo sie entschlüsselt und beim Zugriff den tatsächlichen Klartextwert zurückgibt:

Code: Select all

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
Wenn ich jedoch versuche, eine Abfrage mit ilike zu filtern oder sogar die integrierte Funktion zu verwenden, löst die Abfrage eine Ausnahme aus:

Code: Select all

# 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: Das JSON-Objekt muss str, bytes oder bytearray sein, nicht InstrumentedAttribute

Das Problem besteht darin, dass sqlalchemy User.private1 als InstrumentedAttribute anstelle der tatsächlichen Verschlüsselungszeichenfolge aus der Datenbank zurückgibt. Wenn also json.loads() ausgeführt wird, schlägt die Ausführung aufgrund der Daten fehl ist eigentlich nicht json.
Wie kann ich mit ilike und func Suchen nach diesen Hybrideigenschaften ausführen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post