使用Python获取Rethinkdb数据库的大小

时间:2014-09-18 08:18:30

标签: python rethinkdb

如何使用Python获取给定rethinkdb数据库的大小?我想要这个,因为我正在为rethinkdb开发一个多用户图形前端,并希望能够为每个用户的数据库强制执行配额。

下面的内容会很棒:

r.db('thedatabase').size().run()
50gb

2 个答案:

答案 0 :(得分:3)

RethinkDB没有用于此类操作的内置命令。

最简单的解决方案可能是在他们自己的(有限的)分区上启动多个RethinkDB实例(使用Docker可能会使这里的事情变得更容易)。

答案 1 :(得分:3)

我知道这是一个迟到的答案,并不像你要求的那样漂亮,但只是将它放在这里,以供将来寻找此功能的人使用:

执行此操作的一种方法是访问RethinkDB虚拟数据库rethinkdb。里面有一个统计表,其中包含大量有关数据库使用情况的信息。

r.db('rethinkdb')
    .table('stats')
    .filter(
        r.row('id').contains('table_server')
    )('storage_engine')('disk')('space_usage')('data_bytes')
    .reduce((left, right) => left.add(right))

此查询将检索所有节点中所有节点的所有表的大小。实质上,它只是从stat对象中读取每个单独表的用法并将其添加。

请注意,这会在分片设置中结合使用所有节点(我认为)。

按服务器过滤:

r.db('rethinkdb')
    .table('stats')
    .filter(r.and(
        r.row('id').contains('table_server'),
        r.row('server').eq('servername')
    )
    )('storage_engine')('disk')('space_usage')('data_bytes')
    .reduce((left, right) => left.add(right))

基本上与第一个只有and

形式的额外过滤条件相同

按数据库过滤:

r.db('rethinkdb')
    .table('stats')
    .filter(r.and(
        r.row('id').contains('table_server'),
        r.row('db').eq('dbname')
    )
    )('storage_engine')('disk')('space_usage')('data_bytes')
    .reduce((left, right) => left.add(right))

与上面相同,只是使用db。

r.db('rethinkdb')
    .table('stats')
    .filter(r.and(
        r.row('id').contains('table_server'),
        r.row('db').eq('dbname'),
        r.row('table').eq('tablename')
    )
    )('storage_engine')('disk')('space_usage')('data_bytes')

按表名过滤几乎相同。请记住,如果您要定位数据库中的特定表,则应确保还为数据库添加过滤器。否则,两个具有相同名称的表将返回两个大小值。另请注意,我们只期望一个结果,因此不需要减少。

最后请记住,他们只是ReQL查询。

另请注意,这使用JavaScript箭头(=>)函数。在Python中,您只需将其替换为.reduce(lambda left, right: left+right)

如果您有任何改进,请发表评论:)