odps/models/schema.py (101 lines of code) (raw):
# Copyright 1999-2024 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import datetime
import warnings
from .. import serializers
from ..compat import Enum
from ..errors import InvalidParameter, MethodNotAllowed
from ..utils import parse_rfc822, with_wait_argument
from .core import JSONRemoteModel, LazyLoad
from .functions import Functions
from .resources import Resources
from .tables import Tables
from .volumes import Volumes
def _parse_schema_time(time_str):
try:
return parse_rfc822(time_str, use_legacy_parsedate=False)
except (TypeError, ValueError):
return datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
class SchemaType(Enum):
MANAGED = 0
EXTERNAL = 1
class SchemaDescription(JSONRemoteModel):
name = serializers.JSONNodeField("name", set_to_parent=True)
owner = serializers.JSONNodeField("owner", set_to_parent=True)
description = serializers.JSONNodeField("description", set_to_parent=True)
creation_time = serializers.JSONNodeField(
"createTime", parse_callback=_parse_schema_time, set_to_parent=True
)
last_modified_time = serializers.JSONNodeField(
"modifyTime", parse_callback=_parse_schema_time, set_to_parent=True
)
type = serializers.JSONNodeField(
"type", parse_callback=lambda x: getattr(SchemaType, x.upper())
)
class Schema(LazyLoad):
default_schema_name = "DEFAULT"
_root = "Schema"
name = serializers.XMLNodeField("Name")
owner = serializers.XMLNodeField("Owner")
description = serializers.XMLNodeField("Description")
creation_time = serializers.XMLNodeField(
"CreateTime", parse_callback=_parse_schema_time
)
last_modified_time = serializers.XMLNodeField(
"ModifyTime", parse_callback=_parse_schema_time
)
type = serializers.XMLNodeField(
"Type", parse_callback=lambda x: getattr(SchemaType, x.upper())
)
def reload(self):
try:
self.parent._check_schema_api()
resp = self._client.get(self.resource() + "/schemas/" + self.name)
self.parse(self._client, resp, obj=self)
self.owner = resp.headers.get("x-odps-owner")
self.creation_time = parse_rfc822(
resp.headers.get("x-odps-creation-time"), use_legacy_parsedate=False
)
self.last_modified_time = parse_rfc822(
resp.headers.get("Last-Modified"), use_legacy_parsedate=False
)
self._loaded = True
except (InvalidParameter, MethodNotAllowed):
desc_instance = self.project.odps.execute_sql("DESC SCHEMA %s" % self.name)
desc_result = desc_instance.get_task_results().get("AnonymousSQLTask")
desc_obj = SchemaDescription(parent=self)
desc_obj.parse(self._client, desc_result, obj=desc_obj)
self._loaded = True
@property
def create_time(self):
warnings.warn(
"Schema.create_time is deprecated and will be replaced "
"by Schema.creation_time.",
DeprecationWarning,
stacklevel=3,
)
return self.creation_time
@property
def modify_time(self):
warnings.warn(
"Schema.modify_time is deprecated and will be replaced "
"by Schema.last_modified_time.",
DeprecationWarning,
stacklevel=3,
)
return self.last_modified_time
def resource(self, client=None, endpoint=None):
return self.parent.resource(client, endpoint=endpoint)
@with_wait_argument
def drop(self, async_=False):
self.parent.delete(self, async_=async_)
@property
def functions(self):
return Functions(client=self._client, parent=self)
@property
def resources(self):
return Resources(client=self._client, parent=self)
@property
def tables(self):
return Tables(client=self._client, parent=self)
@property
def volumes(self):
return Volumes(client=self._client, parent=self)