Gem 刚撸的 InfluxDB ORM

xjz19901211 · 2017年06月11日 · 最后由 xjz19901211 回复于 2017年06月12日 · 2576 次阅读

最近在使用 InfluxDB,没有看到啥 ORM,只有一个 palkan/influxer,看着使用方式不是很喜欢,于是自己撸了,虽然比较粗糙,不过胜在简单方便,代码也就三四百来行,有兴趣的可以试试 InfluxORM

Init

InfluxORM.setup(
  connection: { # 具体见 InfluxDB::Client.new
    database: 'test'
  }
)

Define MEASUREMENTS

class Memory
  include InfluxORM

  influx_tag :host
  influx_tag :region
  influx_value :free
  influx_value :used, :int # support :int, :float, :boolean, :string
end

Write

Memory.insert(host: 'A', region: 'US', free: 1234, used: 2234)

Memory.import([
  {host: 'A', region: 'US', free: 1234, used: 2234, timestamp: 1234567890},
  {host: 'A', region: 'US', free: 1244, used: 2224, timestamp: 1234567900},
  {host: 'B', region: 'US', free: 234, used: 3234}
])

Query

Memory.count # => 4
Memory.where(host: 'A').count # => 1
Memory.select('mean(*)') \
  .where(host: 'A', time: {gte: Time.now - 10.day, lte: Time.now - 1.day}) \
  .group_by('time(1m) fill(0)').result

Memory.where(host: 'B').or(host: 'C').limit(10).result
Memory.where("host = 'A' AND time > now() - 1d").where(free: {lt: 1024}).result

query_obj = Memory.where(host: 'A').or(host: 'B')
Memory.where(region: 'US').or(query_obj) # select * from memorys where region = 'US' OR (host = 'A' OR host = 'B')

More query methods

  • select: select('mean(*)'), select({mean: 'tag_name', sum: 'tag_name'})
  • where: where('tag = \'value\''), where(tag: 'value', time: {gt: Time.now - 1.day})
  • or: or('tag = \'value\''), or(tag: 'value', time: {gt: Time.now - 1.day})
  • group_by: group_by('host')
  • fill: fill(0)
  • limit: limit(1)
  • slimit: slimit(1)
  • offset: offset(1)
  • soffset: soffset(1)

个人看法 influx 这种非关系数据库不需要 orm… 因为操作的不是 model 对象 如果需要也是类似 AREL 之类的 Influx SQL Generator

InfluxDB 长久以来的问题是自身不稳定,包括底层存储数据结构和上层 API 接口也一直在变化中。

叫习惯了,哈哈哈哈

目前的主要功能就是提供方便的 SQL 生成,不用手写 SQL,数据映射还真没做啥,直接返回了查询的 hash

另一方面,写入数据时可以有一个简单的框来定义数据结构,有哪些 tag, value

kgen 回复

如果没有过行复杂的逻辑,应该也触及不到这些变化吧。。。

字段类型就那么几个,tag, value 这两类也不会有啥变的了,然后就一些聚合统计函数了

我是刚折腾,没踩过啥坑的人,哈哈哈

xjz19901211 回复

我们当时依赖 InfluxDB 做一些实时数据处理,逻辑比较复杂,它接口一直改,最终我们放弃了。

kgen 回复

后来你们换成什么方案了?想了解下,哈哈

xjz19901211 回复

基于安全原因,我们采用的方案都是不说的,只有抛弃的方案可以公开 😂

需要 登录 后方可回复, 如果你还没有账号请 注册新账号