气象数据查询接口设计的简要方案

April 2017 · 1 minute read

这里我们指的是存储在数据库里的站点气象数据,存储在文件中的格点数据是另一回事了。

气象数据的特点是包括时间、地点、层次、要素等多个维度,通常以特定文本格式存储的数据不便于数据的提取和查询,尤其当这种提取和查询经常发生的时候。因此,导入关系型数据库,然后编写查询方法,对用户提供查询服务就是非常必要的了。

通常,数据源的格式是固定的,而且随着时间的延伸,数据会不断更新,那么编写一套数据读取和写入数据库的程序就会方便后续的数据更新工作了。

python操作数据库有两种方式,一种是不同数据库采用不同的软件包(如对于MS SQL可以使用pymssql,对于MySQL可以使用pymysql,对于sqlite可以使用sqlite3),一种是基于对象-关系映射模型(ORM)的软件包(如SQLAlchemy)。两种方式都是比较容易的,官方文档都有很好的示例,参照按部就班写就可以了。使用SQLAlchemy的好处是可以更容易的切换不同数据库。

数据库表的设计应当看数据的具体情况,具体分析,没有太多可说的。当写入和读取数据库数据的方法写好之后,就是后续的调用和封装工作了。读取的方法有哪些,取决于查询的需求有哪些,一一对应就可以了。通常,查询都包括时间范围、空间范围、要素名称、统计方式(如平均值、累计值、最大最小值)等方面。

接下来就是对外提供数据查询服务了,可能直接被用户调用,也可能被其它外部程序调用。数据查询接口一般只涉及到数据的读取,很少涉及到数据的写入,因此来说功能比较单一,实现起来也比较容易。对于上述写好的读取方法,只需要利用HTTP服务封装一下就可以了。我们采用FlaskTornado框架就可以很轻松完成任务了,其中需要注意的基本问题包括:

  1. url的设计应符合约定俗成的规范,清晰明了。
  2. 只编写和允许必要的请求方法,禁止不必要的请求。
  3. 接口说明文档应编写好并放在一个类似/api/help的url里以便用户查阅。

进一步,可能遇到的问题包括:

  1. 如果有查询不同结果格式的需求,应在查询结果之后增加一个统一的格式处理方法。
  2. 如果有区分用户权限的功能需求,应在查询方法之前增加一个权限管理模块。
  3. 如果有提高服务的性能的需求,应相应的从硬件配置、缓方式、多任务并行等方面解决。