【问题标题】:How to store data with python and sqlite? [duplicate]如何用 python 和 sqlite 存储数据? [复制]
【发布时间】: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 值 usernamepassword 作为用户名和密码,当您真正想要插入的是 Python 变量 usernamepassword 的值时。要解决这个问题,请执行 query_db(insert into accounts (username, password) values(?, ?), args=(username, password))`。
  • 当你修复那个时,你将尝试在一个不返回任何结果的 SQL 查询之后调用fetchall,这也是非法的(尽管你可能不会得到错误)。您想更改query_db 以获取一些额外的标志——它不仅仅是“一行”或“所有行”,它是“一行”或“所有行”或“根本不进行提取”。 (另外,当你想要一行时,你应该只调用fetch,而不是调用fetchall,然后丢弃所有其他行,但这只是性能问题,而不是正确性问题。)

标签: python sql sqlite flask flask-wtforms


【解决方案1】:

sqlite3 库在未配置 isolation_level 时隐式执行事务管理。默认情况是修改数据库的语句在事务中隐式管理。 在这种模式下,您需要在执行操作后提交对数据库的修改。

conn.execute('CREATE TABLE accounts (username TEXT, password TEXT)')
conn.commit()

commit

此方法提交当前事务。如果您不调用此方法,则自上次调用 commit() 以来您所做的任何事情都不会从其他数据库连接中看到。如果你想知道为什么你没有看到你写入数据库的数据,请检查你没有忘记调用这个方法。

如果您想关闭此行为并在执行操作时立即写入数据,您可以在建立与数据库的连接时将isolation_level 设置为None

conn = sqlite3.connect('sample.sqlite', isolation_level=None)

有一些documentation on the available options to controlling transactions

注意虽然 (connection.execute 有效)[https://docs.python.org/3/library/sqlite3.html#using-shortcut-methods] 作为在数据库中执行操作的快捷方式,但它隐式地创建了一个游标。我倾向于从连接中显式创建一个游标并将其用于数据库操作。

cur = conn.cursor()
cur.execute('CREATE TABLE accounts (username TEXT, password TEXT)')
conn.commit()
conn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多