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