如何避免基于curl POST请求的sqlite3中的数据重复?

时间:2019-06-01 18:19:51

标签: python sqlite curl bottle

我正在制作一个Web应用程序,其中包括从多个rpis检索数据。这些作为Wi-Fi AP工作,通过curl POST data.json(连接的每个设备的mac地址和信号强度)发送。

bottle.py通过根据设备是新设备还是已更改其信号强度进行插入或替换,将该信息存储在sqlite3数据库中。基本上,bottle.py用作服务器,所有rpi都是客户端(rp1,rpi2,...),它们每10秒通过curl发送信息。该数据库具有存储每个rpi的设备的不同表(table1,table2 ...)。

如果设备断开与rpi1的连接并连接到rpi2,则rpi1不会发送该设备的信息,但发送者是rpi2,与此同时,该设备不在表1中,它将在表2中。因此,我如何拥有一个实时数据库来尽可能多地打印该信息?常量插入和删除?

bottle.py

@route('/', method='POST')
def index():
    body = request.body.read().decode('utf8') # read directly HTTP input
    get_dict = json.loads(body) # decode json and get native python dict
    maclist = get_dict.get('maclist')
    signallist = get_dict.get('signallist')

    data_list = list(zip(maclist, signallist))
    conn = sqlite3.connect('db/users.db')
    c = conn.cursor()
    try:
        c.executemany("INSERT INTO users (MAC,SIGNAL) VALUES(?,?)", data_list)
    except Exception as exc:
        c.executemany("REPLACE INTO users (MAC,SIGNAL) VALUES(?,?)", data_list)


    conn.commit()
    return "Items added."

@route('/data', method='GET')
def index():
    conn = sqlite3.connect('db/users.db')
    c = conn.cursor()
    c.execute('SELECT * FROM users')
    return template('simple.tpl', rows = c.fetchall())

data.json

{
    "maclist": [
        "b6:a2:23:39:b5:27",
        "b1:a2:0b:37:4c:22"
    ],
    "signallist": [
        "-50",
        "-10"
    ]
}

users.db

MAC                SIGNAL
b6:a2:23:39:b5:27  -50       
b1:a2:0b:37:4c:22  -10

0 个答案:

没有答案