получение идентификатора созданной записи в SQLAlchemy - PullRequest
4 голосов
/ 03 февраля 2010

Как я могу получить идентификатор созданной записи в SQLAlchemy?

Я делаю:

engine.execute("insert into users values  (1,'john')")

Ответы [ 2 ]

14 голосов
/ 03 февраля 2010

Когда вы выполняете текстовый оператор, вы зависите от DBAPI, который вы используете, чтобы узнать, доступно ли новое значение PK и каким образом. С SQlite и MySQL DBAPI вы получите его как result.lastrowid, который просто дает вам значение .lastrowid для курсора. В PG, Oracle и т. Д. Нет ".lastrowid" - как кто-то еще сказал, что вы можете использовать "RETURNING" для тех, в случае чего результаты доступны через result.fetchone () (хотя при использовании RETURNING с oracle, опять же, не пользуясь преимуществом конструкций выражений SQLAlchemy, требует нескольких неуклюжих шагов), или если RETURNING недоступен, вы можете использовать прямой доступ к последовательности (NEXTVAL в pg) или операцию «после выборки» (CURRVAL в PG, @@ identity или scope_identity () в MSSQL).

Звучит сложно, верно? Вот почему вам лучше использовать table.insert(). Основная система SQLAlchemy по предоставлению вновь сгенерированных PK предназначена для работы с этими конструкциями. Когда вы находитесь там, метод result.last_inserted_ids() дает вам вновь сгенерированный (возможно, составной) PK во всех случаях, независимо от серверной части. Вышеупомянутые методы .lastrowid, выполнения последовательности, RETURNING и т. Д. Все рассматриваются для вас (0,6 использует RETURNING, когда доступно).

3 голосов
/ 03 февраля 2010

Можно добавить еще одно предложение: RETURNING

е

INSERT INTO users (name, address) VALUES ('richo', 'beaconsfield') RETURNING id

Затем просто получите строку, как если бы ваша вставка была оператором SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...