【问题标题】:Transactions in SQLite with FlaskSQLite 中的事务与 Flask
【发布时间】:2012-07-04 11:39:37
【问题描述】:

我正在使用 Flask 和 SQLite 作为数据库编写 Python Web 应用程序

我有一个带有自动递增 PK 和文件名的表。我想在插入此表时生成文件名,以便第一个文件命名为 file1、第二个文件 2 等。最好的方法是什么?我的第一个想法是做一个事务,我找出下一个 auto-inc,生成文件名,然后插入数据库并提交。问题是我似乎在 Flask 中找不到任何关于事务的信息,听起来它是自动完成的,但我不确定我是否可以依赖 id 查找和 insert 是原子的。我猜另一种选择是在插入语句中以某种方式使用 auto-inc 值,那个新值在那个时候是否可用?任何对这些方法或替代方法的见解将不胜感激!

【问题讨论】:

  • 为什么不直接使用主键呢?您必须在代码中生成文件名,而不是在数据库中,但如果基本名称始终相同,您会很头疼。
  • 这就是我想要做的。这就是这个解决方案:我的第一个想法是做一个事务,在其中我找出下一个 auto-inc,生成文件名,然后插入数据库并提交。问题是我似乎在 Flask 中找不到任何关于事务的信息,这听起来像是自动完成的,但我不确定我是否可以依赖 id 查找和 insert 是原子的。
  • 不,我的意思是,为什么不简单地做这样的事情:now = datetime.now(); conn.execute("INSERT INTO MyFileTable (Created) VALUES (?)", (now, )); 然后稍后您可以从数据库中取出 id id = conn.execute("SELECT ID FROM MyFileTable WHERE Created = ?", (now, )); print "filename{}".format(id)Created 可以是您唯一标识这些文件的任何其他方式。
  • 嗯,绝对是一个有趣的解决方案,没想到使用这样的时间戳。出于某种原因,我在使用 g.db.execute('begin') 时遇到了错误,但我不再是这样了,所以我将继续使用事务。感谢您的建议!

标签: python sqlite transactions flask


【解决方案1】:

如果我正确理解您的问题,您的表格如下所示:

CREATE TABLE files (
  file_id INTEGER PRIMARY KEY AUTOINCREMENT,
  filename TEXT
)

你想原子地:

  1. 在表中使用自动递增的主键值创建一个新行。
  2. 获取该主键。
  3. 使用从键值派生的名称为行设置文件名。

在 Python 中使用 sqlite3,使用事务(根据您的要求):

import sqlite3
con = sqlite3.connect('files.db')
with con:   # Context manager on the connection manages the transaction
    cur = con.cursor()
    cur.execute('INSERT INTO files DEFAULT VALUES')
    file_id = cur.lastrowid   # Get the primary key of the new row
    cur.execute(
        'UPDATE files SET filename="file"||file_id WHERE file_id=?',
        (file_id,)
    )

有关上下文管理器的更多详细信息,请参见此处:

http://docs.python.org/2/library/sqlite3.html

运行后:

sqlite> SELECT * FROM files;
1|file1

由于您使用的是 Flask,因此没有真正的区别。但是,您可能会在 before_request 中调用 connect 并将结果分配给全局,如下所示:

http://flask.pocoo.org/docs/patterns/sqlite3/

最后,您可以考虑的其他方法是表上的 VIEW(如果文件名永远不会改变,并且总是简单地从主键派生),或者表的 AFTER INSERT 触发器。

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多