【问题标题】:Storing (or fetching) multiple values at once from Riak with Python and Flask使用 Python 和 Flask 从 Riak 一次存储(或获取)多个值
【发布时间】:2013-01-12 17:19:18
【问题描述】:

我正在尝试编写一个获取访问者 IP 并存储在 Riak 数据库中的小应用程序。在其 /show 路由上,它应该列出所有访问者,即存储的 IP 和相关日期。但是,出于某种原因,我要么只存储最后一个访问者,要么只获取最后一个访问者。我在这里做错了什么?我确定它不仅是错误的代码问题,而且是错误的方式 - 我正在尝试从顽固的 sql 用户切换,但我无法理解没有 'select * from ...' 可用;)

import riak
import json
from flask import Flask, request, render_template
from datetime import datetime

app = Flask(__name__)
riak = riak.RiakClient(host='some.domain', port=8087, transport_class=riak.RiakPbcTransport)


def date(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj


@app.route('/')
@app.route('/index')
def index():
    db = riak.bucket('visitor')
    ip = request.remote_addr
    time = json.dumps(datetime.now(), default=date)
    new_visitor = db.new('log', data={
        'ip': ip,
        'time': time,
    })
    new_visitor.store()
    return ip


@app.route('/show')
def show():
    db = riak.bucket('visitor')
    visitors = db.get('log')
    return render_template("show.html", visitors=visitors.get_data())


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

【问题讨论】:

    标签: python nosql flask riak


    【解决方案1】:

    您将所有内容存储在同一名称下'log',因此每次收到新请求时都会覆盖该值。

    Riak 存储桶类似于 python dict,您基本上是在对每个请求执行 visitor['log'] = {...data...} 。您可能希望为此使用不同的数据结构,或者如果时间足够离散,则可以使用时间作为键。

    【讨论】:

    • 嗯...那我应该如何存储它们?如果每次都给它们唯一的名称,那么我不知道从 db 中获取什么,因为它的 nosql 并且没有可用的“select * from”。
    • 与 python dict 一样,您可以列出存储桶中的所有键:docs.basho.com/riak/latest/references/apis/http/HTTP-List-Keys
    • 该文档有巨大的“不适用于生产 - 此操作需要遍历存储在集群中的所有键,不应在生产中使用。”警告。我认为,这不是这样做的方法。
    • 那么要么在日期上使用 map reduce,要么查看这篇关于使用二级索引的博文:paperplanes.de/2011/12/13/list-all-of-the-riak-keys.html
    • 据我所知,使用 map reduce 是获取密钥的方法。这会以我现在存储它们的方式起作用,还是有更好的(也许是普遍的)方法来做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多