0

コア SQLAlchemy を使用して postgres データベースに一括更新しようとしています。bulk_update_mappings が機能しません (StaleDataError が報告されます)。だから私は一括更新を行うためにコア機能を使用しようとしています。これは、値に渡された更新データにデータベース内のすべての列がある場合は正常に機能しますが、特定の列のみを更新すると機能しません。私のアプリケーションでは、サーバーとクライアント間の定期的な同期中に、ほとんどの場合、いくつかの列のみが更新されます。

更新用のコード スニペットは次のとおりです。

    conn = session.connection()
    table = table_dict[table_key].__table__
    stmt=table.update().where(and_(table.c.user_id==bindparam('uid'),
    tbl_pk[table_key]==bindparam('pkey'))).values()
    conn.execute(stmt, update_list)

同期のたびに複数のテーブルを更新するため、テーブル名と主キーは配列を介してインデックス化されます。以下の例では、table_dict[table_key] はテーブル 'nwork' に変換され、tbl_pk[table_key] は 'table.c.nwid' に変換され、'nwork.nwid' になります。

update_list は、Python 辞書としての (更新する必要がある) レコードのリストです。レコードにすべての列の値がある場合は正常に機能し、列の一部のみが更新されている場合、次のエラーがスローされます。

    StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'last_sync', in parameter group 1 
    [SQL: u'UPDATE nwork SET type=%(type)s, name=%(name)s, last_sync=%(last_sync)s, 
    update_time=%(update_time)s, status=%(status)s, total_contacts=%(total_contacts)s, 
    import_type=%(import_type)s, cur_index=%(cur_index)s WHERE 
    nwork.user_id = %(uid)s AND nwork.nwid = %(pkey)s']

この場合、last_sync が更新されていないレコードでエラーが発生していました。

レコードのすべての列 (列の同じセット) が更新されない可能性がある一括更新を行う方法は何ですか? SQLAlchemy の Update.values() ドキュメントから多くの情報を見つけることができませんでした。

SQLAlchemy 1.0.14 を実行しています。

4

0 に答える 0