2011-12-21 17 views
13

ORMなしでSQLAlchemyを使用しています。つまり、手作業で作成したSQLのstatememtsを使用して直接バックエンドdbとやりとりします。この例ではPGをバックエンドdb(psycopg2はDBドライバ)として使用しています。これが答えに影響するかどうかはわかりません。SqlAlchemy:最後に挿入されたレコードのIDを取得する

私はこのようなステートメント(簡潔にするため、そのconnはDBへの有効な接続であると仮定)を有する:

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

をユーザテーブルは列(ID [SERIAL PRIMARY KEY]、からなることも想定名前、COUNTRY_ID)私は再びデシベルを押すことなく、理想的には(新規ユーザのIDを得ることができる方法

?)

+0

SQLAlchemyとは何が関係していますか? –

答えて

14

あなたはこのようなINSERT statementRETURNING句を使用することができるかもしれない:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING id") 
+1

私が必要としていることは間違いありません。返されるオブジェクトはどちらの場合もResultProxyであったため、コードを少し修正して(fetchone()を呼び出して)動作させなければなりませんでした。 –

+7

また、 'user.c.ert()。returning(user.c.id).values({'name': 'Homer'、 'country_id':123})' – Pakman

+0

この解決策は 'sqlite'では動作しません。 'sqlalchemy.exc.CompileError:RETURNINGはこの方言の文コンパイラではサポートされていません。その場合、もう一つの解決法( 'lastrowid')が動作します。 –

13

ユーザーlastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 
result.lastrowid 
+3

これはpsycopg2ドライバを使用するPG dbでは機能しません。 –

+0

申し訳ありません私のデスクで私はmysqlを使用していません: – Nilesh

+6

より具体的には、oidのないテーブルでは動作しません。これは現在デフォルトです。そして、とにかくあなたが探しているoidではないことがよくあります。戻り値は優れた解決策です。 – piro

0

現在SQLAlchemyのdocumentation

result.inserted_primary_keyことを示唆している:あなたが唯一のidた場合

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

を動作するはずです!

関連する問題