간단히 말해서 내 질문 : 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 테이블에 새 데이터 항목을 만들고 json_data
SQL 테이블 의 열을 반환 된 URI로 업데이트합니다 .
json_data
열에 액세스하려고 할 때마다 SQL 테이블에 저장된 URI에 대한 GET API 호출을 수행하고 NoSQL 테이블에 저장된 실제 JSON 데이터를 반환합니다.
내 질문 : 내 SQL 테이블에 저장된 URI를 어떻게 얻을 수 JSONDocument
있습니까? .NET Framework를 업데이트 할 때마다 이전 URI에 대한 DELETE API 호출을 수행하고 싶습니다 json_data
.
SQLAlchemy의 매핑 이벤트 콜백을 사용해 보았지만 여전히 내 사용자 지정 형식 뒤에있는 URI를 가져올 수 없습니다.
내 질문이 충분히 명확하지 않은 경우 알려주세요. 어떤 제안이나 아이디어라도 감사합니다.
수행하려는 작업 요약 :
열이있는 Postgresql 데이터베이스 (RDS) 테이블이 있습니다 : id
(int), json_data
(string), other_columns
...
때문에 json_data
열이 너무 많은 저장 공간을 가지고있다, 나는 다른되는 NoSQL 데이터베이스 (DynamoDB의)에 해당 컬럼에 데이터를 이동하는 중이 야. NoSQL 테이블에서 데이터를 업데이트, 삽입 및 소프트 삭제하기 위해 RESTful API 서버를 구현했습니다.
내 앱 json_data
이 다른 Python 코드 의 열에 액세스하려고 할 때마다 API 메서드를 자동으로 호출하는 SQLAlchemy 사용자 지정 형식을 구현하고 싶습니다 .
사용자 지정 TypeDecorator를 제거하고 속성을 사용하여 이와 유사한 SomeTable로 논리를 이동하는 것에 대해 알고 있습니까?
class SomeTable(db.Model):
id = db.Column(db.Integer, primary_key=True)
# The column with large json data
_uri = db.Column(db.JSON)
@property
def json_data(self):
if self._uri is not None:
req = requests.get(self._uri)
return req.json()['data']
else:
return None
@json_data.setter
def json_data(self, value):
req = requests.post(url, data=json.dumps({'data': value}))
self._uri = req.json()['uri']
@property
def uri(self):
return self._uri
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다