Gem 刚撸的 InfluxDB ORM

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

最近在使用 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 回复

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

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