18

私は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' object has no attribute 'inserted_primary_key', but topic_res is 'ResultProxy' object due to debug.
したがって、1 行だけ挿入すると、topic_res.inserted_primary_key を取得できます。

4

2 に答える 2

19

Inserted_primary_key属性は、単一行の挿入に対してのみ機能します。

https://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.ResultProxy.inserted_primary_key

これは、Insert.returning()を明示的に指定しなかった単一行のinsert()構造にのみ適用されます。

これは、一度に1つの「最後に挿入されたID」属性のみが使用可能なままになっているすべてのPythonDBAPIを含むデータベースクライアントライブラリで広く普及している制限によるものです。

于 2012-09-08T01:17:44.297 に答える
1

ResultsProxy がリストまたはリストのようなオブジェクトである可能性があるため、そのオブジェクトの elements=db-rows を反復処理する必要があります。

for e in topic_res:
    print e.inserted_primary_key

編集:「inserted_primary_key」メソッドは、単一行の挿入に対してのみ機能するようです。http://docs.sqlalchemy.org/en/rel_0_6/core/connections.html#sqlalchemy.engine.base.ResultProxy.inserted_primary_keyを参照してください。

于 2012-09-05T14:06:09.683 に答える