Join SQLite3&x2014;使用“连接”一步插入并选择

Join SQLite3&x2014;使用“连接”一步插入并选择,join,sqlite,sql-insert,Join,Sqlite,Sql Insert,我正在使用SQLite3和Python 3。在我当前的代码中,有很多地方需要选择新插入记录的主键值。主键是自动递增的,我更愿意保持这种方式(而不是自己生成主键并在Python端跟踪它们) 我分两步来做这件事——在插入之后选择——但我想知道是否有一种方法可以在一步中使用连接来提高效率 Edit:有人向我指出,中已经有一个解决方案,使用cursor.lastrowid,它确实比两个execute语句快得多(timeit下面的代码使用了链接到上面的解决方案中的示例): 任何人都可以将此作为一个连接来进

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

我分两步来做这件事——
插入之后选择
——但我想知道是否有一种方法可以在一步中使用
连接来提高效率

Edit:有人向我指出,中已经有一个解决方案,使用
cursor.lastrowid
,它确实比两个
execute
语句快得多(
timeit
下面的代码使用了链接到上面的解决方案中的示例):


任何人都可以将此作为一个连接来进行,这样它仍然涉及一个
执行
,但严格限于SQL命令吗?

插入
语句中不可能进行连接

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

INSERT
语句中无法执行联接

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

感谢您指出这一点,这可能是重复的;我把我的问题改窄了。你说的“Python之外”是什么意思?我想我应该说“严格使用SQL指令”。可能是重复的,谢谢你指出这一点;我把我的问题改窄了。你说“Python之外”是什么意思?我想我应该说“严格使用SQL指令”
$ 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
$