我正在使用SQLite3和Python3。我需要选择新插入的记录的主键值。主键是自动递增的,我更喜欢保持这种方式(而不是自己生成主键并在Python中跟踪它们)。我分两个步骤(SELECT
之后的INSERT
)完成此操作,但为了提高效率,我希望使用JOIN
在一个步骤中完成。
Using cursor.lastrowid
比两条execute
语句快(timeit
使用链接示例):
$ 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命令?
2条答案
按热度按时间ippsafx71#
不可能在
INSERT
语句中执行联接。如果要使用SQL命令,可以使用LAST_INSERT_ROWID SQL函数。但是,
INSERT
命令已经返回了相同的值,并且可以在Python中使用Cursor
对象的lastrowid属性进行读取,或者在其他语言的数据库 Package 器中使用等效值。of1yzvn42#
对我来说,它确实工作得不错。我要用在触发器里: