SQLite3 — INSERT и SELECT за один шаг с JOIN

Я использую 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?


person brannerchinese    schedule 11.08.2013    source источник
comment
Спасибо что подметил это; Я пересмотрел свой вопрос, чтобы быть более узким.   -  person brannerchinese    schedule 11.08.2013
comment
Что вы имеете в виду под Python?   -  person CL.    schedule 11.08.2013
comment
Думаю, я должен был сказать строго с использованием инструкций SQL.   -  person brannerchinese    schedule 12.08.2013


Ответы (1)


Невозможно выполнять соединения в операторах INSERT.

Если вы хотите использовать команды SQL, вы можете использовать функцию SQL last_insert_rowid. Однако такое же значение уже возвращается командой INSERT и может быть прочитано с помощью ссылки Cursor. ="nofollow">свойство lastrowid в Python или его эквивалент в оболочках баз данных на других языках.

person CL.    schedule 11.08.2013