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