сохранить многократные данные без повторяющихся данных - PullRequest
0 голосов
/ 20 мая 2019

У меня есть база данных sqlite, которая выглядит следующим образом:

id  user_id  name   data

Я хочу сохранить данные в базу данных sqlite. я получу name и data от пользователя. Здесь я написал код для сохранения данных. но проблема в том, что если пользователь вводит те же данные, он сохраняет их. Я не хочу, чтобы те же данные были сохранены снова. Я использовал условие if else, но оно проверяет только первую строку. Как сделать так, чтобы он проверял несколько строк. Как сделать это возможным

Вот код:

from flask import Flask, request, jsonify, abort, url_for
from flask_httpauth import HTTPBasicAuth
from flask_sqlalchemy import SQLAlchemy
from passlib.apps import custom_app_context as pwd_context
import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_logs2.db'
db = SQLAlchemy(app)
auth = HTTPBasicAuth()
idd = 1

class PersonData(db.Model) :
    __tablename__ = 'person_data'
    id = db.Column(db.Integer, primary_key = True)
    user_id = db.Column(
                        db.Integer,
                        nullable=False
                        )
    name = db.Column(db.String(128))
    data = db.Column(db.String(128))
@app.route('/savedata',methods=['POST'])
def save_data():
    name = request.form['name']
    datas = request.form['data'] 
    print()
    personData = PersonData.query.filter_by(user_id=idd).first()
    if personData:
        if personData.data != datas:
            personData = PersonData(user_id = idd, name = name, data =datas)
            db.session.add(personData)
            db.session.commit()
        elif personData.name != name:
            personData = PersonData(user_id = idd, name = name, data =datas)
            db.session.add(personData)
            db.session.commit()
        else:    
            personData.data = datas
            db.session.commit()
    else:
        personData = PersonData(user_id = idd, name = name, data =datas)
        db.session.add(personData)
        db.session.commit()
    return jsonify({'success':'true'}) 

if __name__ == '__main__':
    db.create_all()
    app.run(host='0.0.0.0', port=5001)

Данные хранятся в таблице:

id  user_id name    data
1   1       steve1  sample data1
2   1       steve2  sample data2
3   1       steve3  sample data3
4   1       steve3  sample data3
5   1       steve2  sample data2
6   1       steve5  sample data5

Требуемый вывод для хранения в таблице:

id  user_id name    data
1   1       steve1  sample data1
2   1       steve2  sample data2
3   1       steve3  sample data3
4   1       steve5  sample data5

1 Ответ

2 голосов
/ 20 мая 2019

В меньшем наборе данных вы можете легко решить его, получив все строки:
personData = PersonData.query.filter_by(user_id=idd).all()
и протестировав его:

for row in personData:
    if (...)

Вы также можете попробовать выбрать данные, соответствующие вашим новым данным(с использованием and_ ):

from sqlalchemy import and_ 
personData = PersonData.query.filter(and_(user_id=idd, name=name, data=datas).first()
if personData:
    print("You already have this data in db!")

Однако, если у вас много строк, это может замедлиться и желательно управлять на уровне базы данных, используя ограничения.Это объясняется здесь :

ALTER TABLE votes ДОБАВИТЬ УНИКАЛЬНЫЙ unique_index (user, email, address);


Я не совсем понимаю ваш вариант использования, но мне кажется, должен быть лучший способ структурировать ваши данные.
Например, что означает столбец name?


Кроме того, на самом деле это не относится к вашему вопросу, но я бы порекомендовал именовать ваши переменные в соответствии с соглашением PEP8 , поэтому наименование вашей переменной person_data предпочтительнее personData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...