SqlAlchemy: получение идентификатора последней вставленной записи - PullRequest
18 голосов
/ 21 декабря 2011

Я использую SQLAlchemy без ORM, то есть с помощью созданных вручную SQL-состояний для непосредственного взаимодействия с бэкэнд-базой данных.В этом случае я использую PG в качестве своей базы данных (psycopg2 в качестве драйвера БД) - я не знаю, влияет ли это на ответ.

У меня есть такие утверждения (для краткости предположим, что conn является допустимымсоединение с БД):

conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)")

Предположим также, что таблица пользователя состоит из столбцов (id [SERIAL PRIMARY KEY], name, country_id)

Как я могу получить идентификаторновый пользователь (в идеале, не нажимая снова на БД?)

Ответы [ 5 ]

19 голосов
/ 21 декабря 2011

Возможно, вы сможете использовать предложение RETURNING оператора INSERT следующим образом:

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)
                       RETURNING *")

Если вы хотите получить только id:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)
                        RETURNING id")
15 голосов
/ 21 декабря 2011

Пользователь lastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)")
result.lastrowid
2 голосов
/ 31 декабря 2017

Текущая SQLAlchemy документация предлагает

result.inserted_primary_key должно работать!

0 голосов
/ 27 декабря 2018

Убедитесь, что вы используете fetchrow/fetch для получения returning объекта

insert_stmt = user.insert().values(name="homer", country_id="123").returning(user.c.id)

row_id = await conn.fetchrow(insert_stmt)
0 голосов
/ 30 октября 2018
result.inserted_primary_key

работал для меня. Единственное, на что следует обратить внимание, это то, что он возвращает список, содержащий этот last_insert_id.

...