如何获得SQLAlchemy自定义类型的原始值?

时间:2017-08-10 21:53:38

标签: python sqlalchemy

我的问题简而言之:是否可以在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方法。

0 个答案:

没有答案