Проверка наличия элемента в базе данных перед его добавлением - PullRequest
0 голосов
/ 17 февраля 2020

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

maybe_existing_article = Article.query.filter_by(url=article.url)
if (maybe_existing_article):
    article = maybe_existing_article.url
    return "exists"

Но это не сработало, я получил "print (" article.id = "+ str (article.id)) NameError : name 'article' не определено ".

Вот соответствующий код, включая новые строки.

##############################################
@app.route('/bootstrap', methods=['GET', 'POST'])
def bootstrap():
    posted = 1
    print ("bootstrap")
    global article
    if request.method == 'POST':
        if not request.form['title'] or not request.form['url'] or not request.form['image_url'] or not request.form['snippet']:
            flash('Please enter all the fields', 'error')
        else:
            article = Article(request.form['title'], request.form['url'], request.form['image_url'],
                               request.form['snippet'])
            maybe_existing_article = Article.query.filter_by(url=article.url)
            if (maybe_existing_article):
                article = maybe_existing_article.url
                return "exists"
            else:
                db.session.add(article)
                try:
                    db.session.commit()
                except exc.SQLAlchemyError:
                   flash('Article url already exists, failed to post new article')
                   posted = 0
                   #return render_template('/error.html', article_url=article.url)

                article_list = Article.query.filter_by(url=article.url)
                if posted == 1:
                    flash('Record was successfully added')
                else:
                    db.session.rollback()
                    article_list = Article.query.filter_by(url=article.url)
                    article=article_list[0]

                print ("article.id=" + str(article.id))
                import json
                print("a")
                return json.dumps(article.id)

    else:
        print("article.id=" + str(article.id))
        urlNumber = str(article.id)

        message = {'greeting':urlNumber}
        return jsonify(message)  # serialize and use JSON headers

А вот и create_tables.py:

article_table = """CREATE TABLE IF NOT EXISTS article (
    id          INTEGER PRIMARY KEY,
    title       TEXT NOT NULL,
    url         TEXT NOT NULL,
    image_url   TEXT NOT NULL,
    snippet     TEXT NOT NULL,
    date_upload TEXT DEFAULT CURRENT_TIMESTAMP,
        CONSTRAINT article_unq UNIQUE (url)
);"""

1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете использовать уникальное ограничение для таблицы, которую хотите, и перехватить ошибку при попытке вставить уже вставленную строку. В SQLite вы не можете добавить это ограничение после создания таблицы, поэтому вам нужно будет снова создать таблицу.

Вы также можете добавить уникальный индекс в таблицу, которая работает практически так же:

CREATE UNIQUE INDEX index_name ON table_name(column_name);

Если вы не можете этого сделать, вы всегда можете отправить SELECT в эту таблицу с идентификатором, который вы пытаетесь вставить, и они возвращают пользователю ошибку, если она уже была вставлен, хотя это вряд ли рекомендуется.

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