如何定义一个类(db.Model类型),使用python中另一个类中定义的值将数据发回前端?

2024-09-30 10:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我用的是烧瓶程序。 我使用以下代码从javascript收集数据:

@app.route('/getFormData', methods=['POST'])
def get_javascript_data():
    params = request.json
    sunElevation = params['sunElevation']
    cloudCoverage = params['cloudCoverage']
    thresholdNDVI = params['thresholdNDVI']
    limitScene = params['limitScene']
    city = params['city']
    coords = params['coords']
    data_search = passData(sunElevation, cloudCoverage, thresholdNDVI, limitScene, city, coords)
    run_script = passData.calcul(data_search)
    return jsonify(data_search.data_dict)

这是我的计算公式:

class passData():
    def __init__(self, sunElevation, cloudCoverage, thresholdNDVI, limitScene, city, coords):
        self.sunElevation = sunElevation
        self.cloudCoverage = cloudCoverage
        self.thresholdNDVI = thresholdNDVI
        self.limitScene = limitScene
        self.city = city
        self.coords = coords
        self.coords.append(self.coords[0])
        self.data_dict = [{'sunElevation':self.sunElevation,
                            'cloudCoverage':self.cloudCoverage,
                            'thresholdNDVI':self.thresholdNDVI,
                            'limitScene':self.limitScene,
                            'city':self.city,
                            'coords':self.coords
                            }]

    def calcul(self):
        main_script(self.sunElevation, self.cloudCoverage, self.thresholdNDVI, self.limitScene, self.city, self.coords)

        return (print("traitement terminé"))

最后将ndvi数据存储在数据库中,表格名为“ndvi+city”。 所有这些工作都很好,但是在我想把这些数据发送回前端以可视化结果之后,这里是我使用的路径

@app.route('/ndviAuto')
def get_ndviAuto():
    query = select([NdviAuto.ogc_fid.label('ogc_fid'), func.ST_AsGeoJSON(func.ST_Transform(NdviAuto.wkb_geometry,4326)).label('wkb_geometry')]).where(NdviAuto.wkb_geometry!=None)
    dataQuery = db.session.execute(query).fetchall()
    data_all = []

    for ndvi in dataQuery:
        ndvi = dict(ndvi)
        data_all.append({
                    'type': 'Feature',
                    'properties':{
                            'id':ndvi['ogc_fid'],
                        },
                        'geometry':json.loads(ndvi['wkb_geometry'])
                        })
    return jsonify(data_all)

为此,我创建了一个类NdviAuto来定义如下:

class NdviAuto(db.Model):
    __tablename__ = 'ndvi_' // + city ?
    ogc_fid = db.Column(db.Integer, primary_key=True)
    wkb_geometry = db.Column(Geometry(geometry_type='POLYGON', srid=32631))

我的问题是,我不知道如何使用值'city'构造这个类来自动获得正确的表。现在,发送回数据的路由是可行的,但是每次我自己都需要更改表名。 我使用postgreSQL数据库


Tags: 数据selfcitydbdataparamscoordsgeometry
1条回答
网友
1楼 · 发布于 2024-09-30 10:37:17

在创建了Declarative类之后,您不能修改__tablename__属性,或者换句话说,您可以修改,但是它没有任何效果。^{}对象已经创建并分配给__table__属性和元数据。声明性的^{}还保留了一个registry of created classes,因此在使用不同的表重新定义类时会收到警告,原因是:使用字符串类名的未来关系等现在将指向重新定义。通常(但不总是)动态表名是DB设计问题的一个标志

因为已经有了动态表,所以可以使用轻量级的^{}^{}结构,而不是完整的声明性类或^{}实例。创建一个生成正确的轻量级表的helper函数,并使用该函数:

def ndvi_auto(city):
    return table(
        'ndvi_{}'.format(city),
        column('ogc_fid', db.Integer),
        column('wkb_geometry', Geometry(geometry_type='POLYGON',
                                        srid=32631)))

在你看来:

@app.route('/ndviAuto')
def get_ndviAuto():
    ndvi_table = ndvi_auto('some_city')

    query = select([ndvi_table.c.ogc_fid,
                    func.ST_AsGeoJSON(
                        func.ST_Transform(
                            ndvi_table.c.wkb_geometry,
                            4326
                        )
                    ).label('wkb_geometry')]).\
        where(ndvi_table.c.wkb_geometry != None)

    result = db.session.execute(query)

    data = [{'type': 'Feature',
             'properties': { 'id': ndvi.ogc_fid },
             'geometry': json.loads(ndvi.wkb_geometry)}
            for ndvi in result]

    return jsonify(data)

相关问题 更多 >

    热门问题