I'm trying to do a bulk update using core SQLAlchemy to a postgres 
database. bulk_update_mappings does not work (reports StaleDataError). So 
I'm trying to use core functions to do a bulk update. This works fine when 
the update data passed to the values have all the columns in the db but 
fails to work when we update only a certain columns. In my application, 
during periodic syncs between the server and the client only a few of the 
columns will get updated most of the times.

The code snippet I have for update is :

    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)

Since I update multiple tables on every sync, table names and primary keys 
are indexed through an array. For the example below table_dict[table_key] 
would translate to the table 'nwork' and tbl_pk[table_key] would translate 
to 'table.c.nwid' which would be 'nwork.nwid'.

The update_list is a list of records (that need to get updated) as a python 
dictionary. When the record has values for all the columns it works fine 
and when only some of the columns is getting updated it's throwing the 
following error:

    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']

In this case the error was happening for a record where the column 
'last_sync' was not getting updated.

What's the way of doing a bulk update where the records may not have all 
the columns (the same set of them) getting updated? 


I'm running SQLAlchemy 1.0.14.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to