2012-09-05 5 views
14

を使用して行を挿入した後に、主キーを取得します。私はSQLAlchemyのに多くの行を挿入していSQLAlchemyの

connection = engine.connect() 
topic_res = connection.execute(message_topics.insert(),[ 
     { 
     'mt_date': time.time(), 
     'mt_title': title, 
     'mt_hasattach':u'0', 
     'mt_starter_id':member.member_id, 
     'mt_start_time': time.time(), 
     'mt_last_post_time': time.time(), 
     'mt_invited_members': u'a:0:{}', 
     'mt_to_count': u'1', 
     'mt_to_member_id':member.member_id, 
     'mt_replies': u'1', 
     } for member in members ]) 
topic_res.inserted_primary_key 

私が挿入された主キーを取得しよう、と私は取得しています:
はAttributeError:「をMySQLExecutionContext_mysqldb」オブジェクトが持っています'inserted_primary_key'属性はありません。 ですが、topic_resはデバッグのために 'ResultProxy'オブジェクトです。
私は1行しか挿入しないので、topic_res.inserted_primary_keyを取得できます。

+0

良い回答があります。いずれにも同意してください。 – I159

答えて

13

を参照inserted_primary_key属性が単一行の挿入のための唯一の機能である:

http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html?highlight=inserted_primary_key#sqlalchemy.engine.base.ResultProxy.inserted_primary_key

This only applies to single row insert() constructs which did not explicitly specify Insert.returning().

これが唯一の全てのPython DBAPIs含むデータベースクライアントライブラリで広く普及して制限のためであります「最後に挿入されたID」属性は、一度に使用できるままにします。

+0

MySQLのために、複数の挿入を行い、すべての挿入されたIDのリストを1回の呼び出しで取得する方法はありませんか?それぞれをループしてinserted_primary_keyを取得する代わりに、一度にすべてを挿入すると25xのパフォーマンスの違いが見られます。 – Zitrax

+1

DBAPIはこれをサポートしておらず、mysqlアダプタは非標準APIを提供していないようです。これは古い回答ですので、http://docs.sqlalchemy.org/en/rel_0_9/faq.html#im-inserting-400-000-rows-with-the-orm-and-it-s-状況の概要については本当に遅いです。 – zzzeek

1

あなたは、そのオブジェクトの要素=デシベル-行を反復処理する必要がありますので、たぶん、あなたResultsProxyは、リストまたはリストのようなオブジェクトです:

for e in topic_res: 
    print e.inserted_primary_key 

EDIT:メソッド「inserted_primary_keyは」だけのために働くようです単列挿入。 http://docs.sqlalchemy.org/en/rel_0_6/core/connections.html#sqlalchemy.engine.base.ResultProxy.inserted_primary_key

関連する問題