Я использую SQLite3 и Python 3. В моем текущем коде есть много мест, в которых мне нужно выбрать значение первичного ключа вновь вставленной записи. Первичные ключи автоматически увеличиваются, и я бы предпочел оставить их такими (вместо того, чтобы самостоятельно генерировать первичные ключи и отслеживать их на стороне Python).
Я делаю это в два шага — SELECT
после INSERT
— но мне интересно, нет ли способа сделать это за один шаг для большей эффективности, используя JOIN
.
Изменить: мне было указано, что решение уже есть в более раннем вопросе. , используя 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?