2016-08-29 6 views
2

はSQLAlchemyのクラスです:私はGROUP_NAMEを追加したり、(例えば)group_nameのを更新SQLAlchemyレコードを「更新」して「更新」することはできますか?ここ

class MyGroup(Base): 
    __tablename__ = 'my_group' 
    group_id = Column(Integer, Sequence('my_seq'), primary_key=True) 
    group_name = Column(String(200), nullable=False, index=True) 
    date_created = Column(DateTime, default=func.now()) 
    date_updated = Column(DateTime, default=func.now(), onupdate=func.now()) 

いつでも、date_updatedフィールドが更新されます。それは素晴らしいことです。

しかし、グループレコード自体が変更されていなくても(たとえば、異なるが関連するテーブルのデータが更新された場合など)、グループを「更新済み」としてマークする場合があります。

私は手動でそれを行うことができます:

group = session.query(SgmGroup).filter(SgmGroup.group_name=='Some Group').one() 
group.date_updated = datetime.datetime.utcnow() 
session.commit() 

を私は本当にむしろモデルは、独自の方法でそれをやらせるのではなく、手動で日付を更新するために、Pythonのプロセスを再作成すると思います。変更しないでしょう(種類のUNIX touchのような)「タッチ」のレコードをするSQLAlchemyの持つ方法はあり

(例えば、マニュアル機能が誤ってutcnow()を使用しながら、モデルがnow()を使用しているかもしれないようなミスを避けるため)レコードの他の値はどれですか?しかし、onupdate=関数をトリガーしますか?

答えて

1

私はソースを見ていないが、docsから、これが唯一のSQL UPDATEコマンド発行によってトリガーされるようだ:

にonUpdate - デフォルト値を表すスカラ、Pythonは呼び出し可能な、またはClauseElementをUPDATEステートメント内の列に適用されます。この列は、更新のSET句に存在しない場合に更新時に呼び出されます。これは、for_update = Trueの位置引数としてColumnDefaultを使用するためのショートカットです。

あなたの懸念は、あなたの「タッチ」はあなたがタッチを実行するために、あなたのモデルにメソッドを定義し、onupdateパラメータポイントにこのメソッドを持つことができonupdate機能と同じ機能を使用していることを確実にした場合。

は、私はこのような何かが働くだろうと思う:

class MyGroup(Base): 
    __tablename__ = 'my_group' 
    group_id = Column(Integer, Sequence('my_seq'), primary_key=True) 
    group_name = Column(String(200), nullable=False, index=True) 
    date_created = Column(DateTime, default=func.now()) 
    date_updated = Column(
     DateTime,  
     default=self.get_todays_date(), 
     onupdate=self.get_todays_date()) 

    def get_todays_date(self): 
     return datetime.datetime.utcnow() 

    def update_date_updated(self): 
     self.date_updated = self.get_todays_date() 

あなたは、このようなあなたのレコードを更新できます。

group.update_date_updated() 
session.commit() 
+0

うん、多分それはそれを行うための唯一の方法です。ありがとう。 –

+0

おそらく 'touch()'メソッドを呼び出す –

+0

@GraemeStuartどのような 'touch()'のメソッドですか?あるいはその使用例を見せてもらえますか? – kip2

関連する問題