我能够将一个字段添加到 SQLAlchemy 数据库,但在添加另一个字段时给出 "Operational Error"
I am able to add one field to the SQLAlchemy database but gives "Operational Error" upon adding another field
我正在尝试创建简单的数据库以接受来自使用 SQLAlchemy 和 Flask 的用户的姓名和反馈。如果我的 db_models.py 文件中只有 'feedback',该网站就可以正常工作。但是,如果我添加 'name' 字段,则会发生错误。我不知道发生了什么,因为我之前没有使用过数据库。任何帮助将不胜感激。
这是我的init.py文件-
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
<---->
这里是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}')"
<---->
我 运行 这个程序是 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)
数据库和python程序是两个不同的东西。您的程序正在访问数据库(即 sqlite:///site.db)。但是您的程序认为 table FB 具有列 id、反馈、名称,而实际上它只有列 id、反馈。
您一定是以某种方式创建了数据库,可能您在 python 解释器中做了类似的事情:
from vedicm import db
db.create_all()
这在文件 site.db 中创建了您的数据库。后来您对模型进行了更改(class FB),但您的数据库没有更新。有道理吗?
现在怎么办?最简单的解决方案可能是删除 site.db 并再次执行 db.create_all() 。但是您将丢失到目前为止所做的数据。另一种可能性是使用外部工具连接到数据库文件并在那里更新它。但是我猜你对数据库一无所知,那太难了。
最后,当你对这些东西更加熟悉时,你一定要看看数据库迁移,有一个非常好的 sqlalchemy 工具叫做 alembic。
我正在尝试创建简单的数据库以接受来自使用 SQLAlchemy 和 Flask 的用户的姓名和反馈。如果我的 db_models.py 文件中只有 'feedback',该网站就可以正常工作。但是,如果我添加 'name' 字段,则会发生错误。我不知道发生了什么,因为我之前没有使用过数据库。任何帮助将不胜感激。
这是我的init.py文件-
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
<---->
这里是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}')"
<---->
我 运行 这个程序是 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)
数据库和python程序是两个不同的东西。您的程序正在访问数据库(即 sqlite:///site.db)。但是您的程序认为 table FB 具有列 id、反馈、名称,而实际上它只有列 id、反馈。
您一定是以某种方式创建了数据库,可能您在 python 解释器中做了类似的事情:
from vedicm import db
db.create_all()
这在文件 site.db 中创建了您的数据库。后来您对模型进行了更改(class FB),但您的数据库没有更新。有道理吗?
现在怎么办?最简单的解决方案可能是删除 site.db 并再次执行 db.create_all() 。但是您将丢失到目前为止所做的数据。另一种可能性是使用外部工具连接到数据库文件并在那里更新它。但是我猜你对数据库一无所知,那太难了。
最后,当你对这些东西更加熟悉时,你一定要看看数据库迁移,有一个非常好的 sqlalchemy 工具叫做 alembic。