Updating SQLite table with Python function using table columns as arguments -
i trying update
records of table results of function uses other rows of table arguments. however, result of operation records repeated first record. can explain why might case?
def fun(a,b,c,d): return + b + c + d cur = conn.cursor() cur.execute("select field1, field2, field3, field4 table1") row in cur: cur.execute("update table1 set field5 = ?", (fun(row[0],row[1],row[2],row[3]),))
the completed table looks this:
field1, field2, field3, field4, field5 4, 3, 2, 1, 10 7, 3, 1, 0, 10 8, 5, 2, 0, 10
when should this:
field1, field2, field3, field4, field5 4, 3, 2, 1, 10 7, 3, 1, 0, 11 8, 5, 2, 0, 15
first, select of rows:
select field1, field2, field3, field4 table1
this yields result set in cur
:
4, 3, 2, 1 7, 3, 1, 0 8, 5, 2, 0
you begin iterate through rows. start first row:
4, 3, 2, 1
you add columns together, correctly yielding result 10
. execute sql statement:
update table1 set field5 = 10
whoa, there! there's no where
clause! you've changed field5
of every single row! that's problem #1: you need add where
clause. tables have primary key, if have primary key, you'll want add clause where id = ?
. if don't have primary key, best can include other columns, e.g.
update table1 set field5 = ? field1 = ? , field2 = ? , field3 = ? , field4 = ?
make sure provide value each ?
in execute
call.
so you've finished executing update
statement on cur
cursor. go iterate again… and there's no more rows. why? because update
statement changed result set of cursor, discarding remaining rows of select
. you need run updates on different cursor or fetch rows before move on updating.
Comments
Post a Comment