2017-06-07 8 views
1

私はこのような何か実行している:それはid主キーに基づいて更新をやっているので、一列のみを更新することが保証されて実際に更新された列を別の値に変更しますか?

cursor.execute(
    ''' 
    UPDATE my_table 
    SET name=%s, about=%s, title=%s 
    WHERE id=%s 
    ''', 
    (name, about, title, id_) 
) 

を。

はしかし、フィールドの一度だけのほとんど実際変化、すなわちabouttitleは、それらが存在していた同じ値に「更新」されている、とだけnameは、実際に変更されました。

実際に変更された列はどのように取得できますか?これは、個々の変更をすべて記録するために必要です。

+0

に対してロジックを置くことができますので、あなたがリストのようなものを取得したいですタプルの '(row、column_name)'? – yeputons

+0

ええ、しかし、私は「IDの主キーに基づいて更新を行っているので、1行だけを更新することが保証されています」*を追加しました。*ので、個人的には列名のリストを取得するだけで十分です。 –

+0

Returning name、about、タイトルで追加しようとしましたか? Where句の後ろに? – J2112O

答えて

2

あなたが更新前の値を選択してRETURNING *を使用することができますが、ここのように、最後のクエリで値を比較:

t=# create table m1 (i int, e int); 
CREATE TABLE 
Time: 1.855 ms 
t=# insert into m1 select 1,2; 
INSERT 0 1 
Time: 1.037 ms 
t=# begin; 
BEGIN 
t=# with o as (select * from m1 where i=1) 
,u as (update m1 set e=3 where i=1 returning *) 
select * from o 
join u on o.i = u.i 
; 
i | e | i | e 
---+---+---+--- 
1 | 2 | 1 | 3 
(1 row) 

ますので、u.e <> o.eまたは似

+0

ああ、これはうまくいきます。ありがとう:) –

関連する問題