2016-12-06 14 views
0

私はdb内の単一の行を更新する関数を持っています。複数の挿入/更新をコミットするPython DB-Api

def update_one_row(conn, condition, value): 
    with conn.cursor() as curr: 
     curr.execute("""UPDATE persons p 
         SET p.age=%s 
         WHERE p.name=%s;""", 
        (value, condition)) 

それは、この関数の複数(数千)時間を使用し、その後conn.commit()を行い、このようにしても大丈夫です:

from pymysql import Connect 
connect_args = {...} 
conn = Connect(**connect_args) 
for condition, value in iterable_of_conditions_values: 
    update_one_row(conn, condition, value) 
# Here I visually inspect in jupyter notebook if things went as expected and I accidentaly did not screw up 
conn.commit() 

または私はupdate_one_rowcurr代わりのconnを渡す必要がありますか?

私はcurr.executemany()を認識していますが、私は明示的なループを優先します。パフォーマンスの違いはありますか?

全体として、私はカーソルの使い方やコミットのタイミングがかなり崩れています。

答えて

0

変更を一括して適用したいときに、コミットする必要があります。どこかに問題が発生した場合は、ロールバックするかコミットしないかを選択します。最も一般的なケースでは、変更を一緒に適用するだけで意味がある場合に使用されます。

あなたのケースでは、それは数千回後にコミットするのが理にかなっています。システムを過度に複雑にしないためには、ループの後に1回だけコミットするのが最善の方法です。それ以外の場合は、更新された行と更新されていない行を追跡する必要があります。

関連する問題