【问题标题】:In Flask: When using wtforms, SQLAlchemy, getting "OperationalError: (sqlite3.OperationalError) no such table:" when the table exists在 Flask 中:使用 wtforms、SQLAlchemy 时,当表存在时出现“OperationalError: (sqlite3.OperationalError) no such table:”
【发布时间】:2015-12-12 11:48:04
【问题描述】:

我有一个非常基本的烧瓶应用程序正在开发中,我在将数据保存到一个绝对存在的 sqlite 数据库和表时遇到问题,如果我使用像这样的直接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命令是否应该在错误中,也许那里有问题。否则,我无法弄清楚为什么这不起作用,因为在许多文档中都显示这是这样做的方法。

【问题讨论】:

  • 这个有用吗:gdb.execute("insert into term values (?)", form.term_txt.data)?
  • 是的,但我希望使用更多的 SQLAlchemy 内置的东西,而不必手动完成所有的 sql
  • 你跑db.create_all()了吗?
  • @IanAuld 你知道这让我意识到我会以另一种方式设置数据库,并且应用程序和数据库之间的连接对于使用 SQLAlchemy 插入或更新数据库是错误的。

标签: sqlite python-2.7 flask sqlalchemy wtforms


【解决方案1】:

对我来说,SQLAlchemy 的数据库似乎配置不正确。该数据库是在没有 SQLAlchemy 的情况下创建的。之后使它工作:How do you set up a Flask application with SQLAlchemy for testing?

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 2015-07-30
    • 2022-06-15
    • 2022-07-22
    • 1970-01-01
    • 2020-05-28
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多