Я могу добавить одно поле в базу данных SQLAlchemy, но выдает «Ошибка при работе» при добавлении другого поля - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать простую базу данных, чтобы принимать имя и обратную связь от пользователя, используя SQLAlchemy и Flask. Сайт работает нормально, если у меня есть только «обратная связь» в моем файле db_models.py. Однако, если я добавлю поле «имя», произойдет ошибка. Я понятия не имею, что происходит, так как я раньше не работал с базами данных. Любая помощь будет оценена.

Вот мой init .py file-

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = 'anjh23op94q2pm5h'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

from vedicm import routes

<---->

Вот маршруты .py

from flask import render_template, url_for, flash, redirect
from vedicm import app, db
from vedicm.forms import FeedbackForm
from vedicm.db_models import FB


@app.route("/", methods=['GET', 'POST']) 
def home():
    form = FeedbackForm()    #A wt form in Flask
    if form.validate_on_submit():
        fb = FB(feedback = form.feedback.data, name = form.name.data) 
        db.session.add(fb)
        db.session.commit()  #Here, all the problem occurs
        flash(f'Feedback Submitted', 'success')
    return render_template("home.html", form=form, title = 'Vedic Mishra')

@app.route("/feedbacks", methods=['GET', 'POST'])
def feedbacks():
    fbs = FB.query.all()
    return render_template("feedbacks.html", title='Feedbacks', feedbacks = fbs)

<---->

Вот Forms.py

from vedicm import db

class FB(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    feedback = db.Column(db.String(100), nullable=False)
    name = db.Column(db.String(25))

    def __repr__(self):
        return f"FB('{self.feedback}', '{self.name}')"

<---->

I запустить это приложение с помощью run.py, я получаю следующую ошибку.

**sqlalchemy.exc.OperationalError**

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table FB has no column named name
[SQL: INSERT INTO "FB" (feedback, name) VALUES (?, ?)]
[parameters: ('Vedic', 'Vedic')]
(Background on this error at: http://sqlalche.me/e/e3q8)

1 Ответ

0 голосов
/ 14 января 2020

База данных и программа python - это две разные вещи. Ваша программа обращается к базе данных (это sqlite: ///site.db). Но ваша программа считает, что таблица FB имеет идентификатор столбца, обратную связь, имя, в то время как в действительности она имеет только идентификатор столбца и обратную связь.

Вы, должно быть, как-то создали базу данных, возможно, вы сделали что-то подобное в python интерпретатор:

from vedicm import db
db.create_all()

Это создало вашу базу данных в файле site.db. Позже вы внесли изменения в вашу модель (класс FB), но ваша база данных не обновилась. Имеет ли это смысл?

Что теперь? Самым простым решением, вероятно, является удаление site.db и повторное выполнение db.create_all (). Но вы потеряете данные, которые вы сделали до сих пор. Другой возможностью было бы подключиться к файлу базы данных с помощью внешнего инструмента и обновить его там. Но поскольку вы ничего не знаете о базах данных, я думаю, это будет слишком сложно.

Наконец, когда вы немного познакомитесь с этим материалом, вам определенно следует изучить миграцию базы данных, есть очень хороший инструмент для sqlalchemy, который называется alembi c.

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