Когда вы выполняете текстовый оператор, вы зависите от 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, когда доступно).