In Flask: When using wtforms, SQLAlchemy, getting "OperationalError: (sqlite3.OperationalError) no such table:" when the table exists
In Flask: When using wtforms, SQLAlchemy, getting "OperationalError: (sqlite3.OperationalError) no such table:" when the table exists
我有一个非常基本的 flask 应用程序正在开发中,我在将数据保存到 sqlite 数据库和 table 时遇到了问题,它肯定存在并且确实采用表单提交如果我像这样使用直接 execute()
方法:
def get_db():
if not hasattr(g, 'sqlite_db'):
g.sqlite_db = connect_db()
return g.sqlite_db
...
gdb = get_db()
gdb.execute("insert into term (term_txt) values (?)", (form.term_txt.data,))
gdb.commit()
模型是:
class Term(db.Model):
id = db.Column(db.Integer, primary_key=True)
term_txt = db.Column(db.String(255), unique=True)
def __init__(self, term_txt):
self.term_txt = term_txt
def __repr__(self):
return '<Term %r>' % self.term_txt
表格为:
{% extends "layout.html" %}
{% block body %}
<form action="{{ url_for('addTerm') }}" method="POST">
{{ form.term_txt }}
{{ form.csrf_token }}
<p><input type="submit" label="Add Term"></p>
</form>
{% endblock %}
但是如果我尝试按照这条路线使用 Flask 建议的方法,我会收到以下错误 OperationalError: (sqlite3.OperationalError) no such table: term [SQL: u'INSERT INTO term (term_txt) VALUES (?)'] [parameters: (u'my test term',)]
:
@app.route('/add_term', methods=('GET', 'POST'))
def addTerm():
form = AddTermForm(csrf_enabled=True)
if request.method == "POST":
newTerm = Term(term_txt=form.term_txt.data)
db.session.add(newTerm)
db.session.commit()
#gdb = get_db()
#gdb.execute("insert into term (term_txt) values (?)", (form.term_txt.data,))
#gdb.commit()
return redirect(url_for('terms'))
else:
return render_template('new_term.html', form=form)
db
来自:
app = Flask(__name__)
app.config.from_envvar('FLASKAPP_SETTINGS', silent=True)
db = SQLAlchemy(app)
如前所述,数据库存在,如果我在代码中使用上面的 sql 命令,我可以将表单保存到数据库中,但我觉得这不是最好的方法。
我也不知道sql这个命令是不是应该出错了,可能是哪里出了问题。否则,我无法弄清楚为什么这不起作用,因为它出现在许多文档中都是这样做的方法。
对我来说,似乎 SQLAlchemy 的数据库配置不正确。数据库是在没有 SQLAlchemy 的情况下创建的。按照这个使它起作用:How do you set up a Flask application with SQLAlchemy for testing?
我有一个非常基本的 flask 应用程序正在开发中,我在将数据保存到 sqlite 数据库和 table 时遇到了问题,它肯定存在并且确实采用表单提交如果我像这样使用直接 execute()
方法:
def get_db():
if not hasattr(g, 'sqlite_db'):
g.sqlite_db = connect_db()
return g.sqlite_db
...
gdb = get_db()
gdb.execute("insert into term (term_txt) values (?)", (form.term_txt.data,))
gdb.commit()
模型是:
class Term(db.Model):
id = db.Column(db.Integer, primary_key=True)
term_txt = db.Column(db.String(255), unique=True)
def __init__(self, term_txt):
self.term_txt = term_txt
def __repr__(self):
return '<Term %r>' % self.term_txt
表格为:
{% extends "layout.html" %}
{% block body %}
<form action="{{ url_for('addTerm') }}" method="POST">
{{ form.term_txt }}
{{ form.csrf_token }}
<p><input type="submit" label="Add Term"></p>
</form>
{% endblock %}
但是如果我尝试按照这条路线使用 Flask 建议的方法,我会收到以下错误 OperationalError: (sqlite3.OperationalError) no such table: term [SQL: u'INSERT INTO term (term_txt) VALUES (?)'] [parameters: (u'my test term',)]
:
@app.route('/add_term', methods=('GET', 'POST'))
def addTerm():
form = AddTermForm(csrf_enabled=True)
if request.method == "POST":
newTerm = Term(term_txt=form.term_txt.data)
db.session.add(newTerm)
db.session.commit()
#gdb = get_db()
#gdb.execute("insert into term (term_txt) values (?)", (form.term_txt.data,))
#gdb.commit()
return redirect(url_for('terms'))
else:
return render_template('new_term.html', form=form)
db
来自:
app = Flask(__name__)
app.config.from_envvar('FLASKAPP_SETTINGS', silent=True)
db = SQLAlchemy(app)
如前所述,数据库存在,如果我在代码中使用上面的 sql 命令,我可以将表单保存到数据库中,但我觉得这不是最好的方法。
我也不知道sql这个命令是不是应该出错了,可能是哪里出了问题。否则,我无法弄清楚为什么这不起作用,因为它出现在许多文档中都是这样做的方法。
对我来说,似乎 SQLAlchemy 的数据库配置不正确。数据库是在没有 SQLAlchemy 的情况下创建的。按照这个使它起作用:How do you set up a Flask application with SQLAlchemy for testing?