1

我正在使用 SQLite3 和 Python 3。我当前的代码中有很多地方需要选择新插入记录的主键值。主键是自动递增的,我更愿意保持这种方式(而不是自己生成主键并在 Python 端跟踪它们)。

我分两步执行此操作 -SELECT之后INSERT- 但我想知道是否没有一种方法可以一步完成以提高效率,使用JOIN.

编辑:有人向我指出,在较早的问题中已经有一个解决方案using ,这确实比两个语句cursor.lastrowid快得多(下面的代码使用上面链接到的解决方案中的示例):executetimeit

$ python -m timeit -s "\
> import sqlite3;\
> connection=sqlite3.connect(':memory:');\
> cursor=connection.cursor();\
> cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,\
>                                     username varchar(50),\
>                                     password varchar(50))''')" "\
> cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',\
>                ('test','test'));\
> found = cursor.execute('''SELECT id FROM foo \
>                                     WHERE username='test' \
>                                     AND password='test' ''')"
100000 loops, best of 3: 10.1 usec per loop
$
$ python -m timeit -s "\
> import sqlite3;\
> connection=sqlite3.connect(':memory:');\
> cursor=connection.cursor();\
> cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,\
>                                     username varchar(50),\
>                                     password varchar(50))''')" "\
> cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',\
>                ('test','test'));\
> found = cursor.lastrowid"
100000 loops, best of 3: 5.74 usec per loop
$ 

任何人都可以谈论这样做的可能性吗?JOIN相反,它仍然涉及单个execute但严格限于 SQL 命令?

4

1 回答 1

1

不能在INSERT语句中进行连接。

如果要使用 SQL 命令,可以使用last_insert_rowid SQL 函数。但是,命令已经返回了相同的值,INSERT并且可以使用 Python 中Cursor对象的lastrowid 属性或其他语言的数据库包装器中的等效属性来读取。

于 2013-08-11T14:37:36.273 回答