【发布时间】:2019-01-23 18:54:21
【问题描述】:
下面的代码应该是一个简单的用户注册。
数据库.db
import sqlite3
conn = sqlite3.connect('database.db')
conn.execute('CREATE TABLE accounts (username TEXT, password TEXT)')
conn.close()
views.py
import sqlite3
DATABASE = '../FlaskWebProject/database.db'
with app.app_context():
username = request.form['username'];
password = request.form['password'];
query_db("insert into accounts (username, password) values (username, password)")
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
return db
def query_db(query, args=(), one=False):
cur = get_db().execute(query, args)
rv = cur.fetchall()
cur.close()
return (rv[0] if rv else None) if one else rv
错误:
sqlite3.OperationalError:没有这样的表:帐户
【问题讨论】:
-
创建表的代码永远不会执行?我没看到你在哪里调用它。
-
如果它被执行,你确定它引用了与../FlaskWebProject/同一目录下的database.db吗?
-
是的,在同一目录下
-
附带说明,一旦你解决了这个问题,你就会得到一个不同的错误,因为你试图插入 SQL 值
username和password作为用户名和密码,当您真正想要插入的是 Python 变量username和password的值时。要解决这个问题,请执行query_db(insert into accounts (username, password) values(?, ?), args=(username, password))`。 -
当你修复那个时,你将尝试在一个不返回任何结果的 SQL 查询之后调用
fetchall,这也是非法的(尽管你可能不会得到错误)。您想更改query_db以获取一些额外的标志——它不仅仅是“一行”或“所有行”,它是“一行”或“所有行”或“根本不进行提取”。 (另外,当你想要一行时,你应该只调用fetch,而不是调用fetchall,然后丢弃所有其他行,但这只是性能问题,而不是正确性问题。)
标签: python sql sqlite flask flask-wtforms