我的问题简而言之:是否可以在SQLAlchemy中访问自定义类型的原始值?
我自定义类型的实现:
class JSONDocument(TypeDecorator):
# override field
impl = JSON
# Write
def process_bind_param(self, value, dialect):
if value is not None:
req = requests.post(url, data=json.dumps({'data': value}))
uri = req.json()['uri']
value = uri
return value
# Read
def process_result_value(self, value, dialect):
if value is not None:
uri = value
req = requests.get(uri)
value = req.json()['data']
return value
我的桌子型号:
class SomeTable(db.Model):
id = db.Column(db.Integer, primary_key=True)
# The column with large json data
json_data = db.Column(JSONDocument)
每当我尝试更新或插入一行(结果将写入json_data
列)时,SQLAlchemy将调用JSONDocument
' s process_bind_param
。然后,它将执行POST API调用以在我的NoSQL表中创建新数据条目,并将我的SQL表中的json_data
列更新为返回的URI。
每当我尝试访问json_data
列时,它都会对存储在我的SQL表中的URI执行GET API调用,并返回存储在NoSQL表中的实际JSON数据。
我的问题:如何获取JSONDocument
涵盖的SQL表中存储的URI?每当我更新json_data
时,我都希望对旧URI进行DELETE API调用。
我尝试过使用SQLAlchemy的Mapping事件回调,但我仍然无法获取自定义类型后面的URI。
如果我不清楚问题,请告诉我。任何建议或想法都表示赞赏。
我要完成的任务摘要:
我有一个Postgresql数据库(RDS)表,其中包含以下列:id
(int),json_data
(字符串),other_columns
...
由于json_data
列占用的存储太多,我正在努力将该列中的数据移动到其他NoSQL数据库(DynamoDB)。我实现了一个RESTful API服务器,用于在NoSQL表中更新,插入和软删除数据。
我想实现一个SQLAlchemy自定义类型,只要我的应用程序尝试访问其他Python代码中的json_data
列,它就会自动调用我的API方法。