table_info.py 2.7 KB
#author:        4N
#createtime:    2021/1/27
#email:         nheweijun@sina.com

from ..models import Table,Columns,DES,Database,db

from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.ModelVisitor import ModelVisitor
from app.util.component.PGUtil import PGUtil
from osgeo.ogr import DataSource,Layer,Feature
from osgeo.osr import SpatialReference
import configure
class Api(ApiTemplate):
    api_name = "表信息"

    def process(self):
        res = {}
        pg_ds = None
        try:

            table_guid = self.para.get("guid")

            table = Table.query.filter_by(guid=table_guid).one_or_none()
            if not table:
                raise Exception("数据不存在!")

            uri = DES.decode(table.relate_database.sqlalchemy_uri)

            pg_ds :DataSource = PGUtil.open_pg_data_source(0,uri)
            layer:Layer = pg_ds.GetLayerByName(table.name)
            if not layer:
                raise Exception("数据异常!")
            append_dict ={"srid":None,"sr_wkt":None,"sr_proj4":None,"exist":1,"schema":"public","geomfield":layer.GetGeometryColumn()}
            if layer:
                sr:SpatialReference = layer.GetSpatialRef()

                if sr is not None:
                    append_dict["sr_wkt"] = sr.ExportToWkt()
                    append_dict["sr_proj4"] = sr.ExportToProj4()

                srid_sql = '''select st_srid("{}") from public."{}" limit 1'''.format(layer.GetGeometryColumn(),layer.GetName())
                srid_layer:Layer = pg_ds.ExecuteSQL(srid_sql)
                if srid_layer:
                    srid_feature : Feature = srid_layer.GetNextFeature()
                    if srid_feature:
                        if srid_feature.GetField(0):
                            append_dict["srid"] = str(srid_feature.GetField(0))

            else:
                append_dict["exist"]=0
            columns = table.relate_columns.order_by(Columns.name).all()
            res["data"]=ModelVisitor.table_to_json(table)
            res["data"]["columns"] = ModelVisitor.objects_to_jsonarray(columns)
            res["data"].update(append_dict)
            res["result"] = True

        except Exception as e:
            raise e
        finally:
            if pg_ds:
                pg_ds.Destroy()
        return res
    
    api_doc={
    "tags":["管理接口"],
    "parameters":[
        {"name": "guid",
         "in": "formData",
         "type": "string",
         "description": "表guid","required":"true"},
    ],
    "responses":{
        200:{
            "schema":{
                "properties":{
                }
            }
            }
        }
    }