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

时间:2017-08-02 12:51:38

标签: python postgresql sqlalchemy flask-sqlalchemy

首先,我正在使用烧瓶应用程序。 我使用以下代码从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数据库。

1 个答案:

答案 0 :(得分:0)

在创建Declarative类之后,或者换句话说,您可以修改__tablename__属性,但它不起作用。 Table对象已创建并分配给__table__属性和元数据。声明式Base也保留registry of created classes,因此当使用不同的表重新定义类时,您将收到警告,原因如下:使用字符串类名称的未来关系等现在将指向重新定义。通常 - 但并非总是如此 - 拥有动态表名称是数据库设计问题的一个标志。

由于您已拥有动态表,因此您可以使用轻量级table()column()构造而不是完整的声明式类或Table实例。创建一个帮助函数,生成正确的轻量级表并使用:

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)
相关问题