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


import datetime
from ..models import Table,Database,DES
from sqlalchemy.engine import ResultProxy
from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.PGUtil import PGUtil
import json
import decimal



class Api(ApiTemplate):
    api_name = "数据浏览"
    def process(self):

        res = {}
        res["data"] = {}
        db_session=None
        try:  
            table_guid = self.para.get("guid")
            limit = int(self.para.get("limit",50))
            offset = int(self.para.get("offset", 0))
            table :Table= Table.query.filter_by(guid=table_guid).one_or_none()
    
            if not table:
                raise Exception("数据不存在!")
    
            database:Database = table.relate_database
    
            db_session = PGUtil.get_db_session(DES.decode(database.sqlalchemy_uri))

            geom_col = PGUtil.get_geo_column(table.name,db_session)

            query_result : ResultProxy = db_session.execute('select * from "{}" limit {} offset {}'.format(table.name,limit,offset))

            res["data"]["count"]=PGUtil.get_table_count(table.name,db_session)
            res["data"]["count"] = table.feature_count

            pkey = PGUtil.get_pkey(table.name,db_session)

            res["data"]["list"]=[]
            for row_proxy in query_result:
                pkey_dict = {}
                d = {}
                for column, value in row_proxy.items():
                    #跳过空间列
                    if geom_col:
                        if column.__eq__(geom_col):
                            continue
                    if pkey:
                        if column == pkey:
                            pkey_dict[column]=value
                            continue
                    #格式化时间列
                    if isinstance(value, datetime.datetime):
                        d[column] = value.strftime('%Y-%m-%d %H:%M:%S')
                    elif isinstance(value, decimal.Decimal):
                        d[column] = float(value)
                    elif isinstance(value,datetime.date):
                        d[column] = value.strftime('%Y-%m-%d %H:%M:%S')
                    else:
                        d[column]=value
                pkey_dict.update(d)
                res["data"]["list"].append(pkey_dict)
            res["result"]=True
        except Exception as e:
            raise Exception("数据库连接失败!")
        finally:
            if db_session:
                db_session.close()
        return json.dumps(res,ensure_ascii=False)
    
    api_doc={
    "tags":["管理接口"],
    "parameters":[
        {"name": "guid",
         "in": "formData",
         "type": "string",
         "description": "表guid","required":"true"},
        {"name": "limit",
         "in": "formData",
         "type": "int"
         },
        {"name": "offset",
         "in": "formData",
         "type": "int"},
    ],
    "responses":{
        200:{
            "schema":{
                "properties":{
                }
            }
            }
        }
    }