1

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

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

4

1 回答 1

2

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

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 触发器。

于 2013-05-09T16:54:51.637 回答