2011-06-01 4 views
1

SQLAlchemyデータベースを使用しています。SQLAlchemyテーブル内の列のSHA-1チェックサムを別の列として自動的に追加します

私はカラムid,data、およびtimestampという簡単なスキーマを持っています。私はdata列のSHA-1チェックサムを含む別の列を追加したい

Column('timestamp', DateTime, nullable=False, default=datetime.now) 

次のようtimestamp列が自動的に現在の日付/時刻が移入されます。

# notice this is INVALID CODE 
Column('checksum', String, nullable=False, unique=True, 
     default=hashlib.sha1(this_table.data).hexdigest()) 

何か提案がありますか?

ありがとうございます。

編集:

私はこれに来ている最も近いオブジェクトレベル(テーブルレベルではなく)で「自動化」を管理することです。私は単に

Column('checksum', String, nullable=False, unique=True) 

としてchecksum列を定義して、そのテーブルにマップされたオブジェクトのコンストラクタを変更します。期待どおりに動作します

def __init__(self, data): 
self.data = data 
self.checksum = hashlib.sha1(self.data).hexdigest() 

が、実行する方法があるかどうか私はまだ疑問に思いますこれは「テーブル」レベル(timestampのようにオブジェクトレベルでは何もしませんが、現在の日付/時刻を正しく割り当てます)

答えて

2

SqlAlchemy MapperExtensionでは、イベントのコード側のトリガー/フックを作成できます。

http://www.sqlalchemy.org/docs/06/orm/interfaces.html

基本的には、余分なアクションを実行するbefore_insertとbefore_updateを作成したいと考えています。 1つの列のコンテンツをデータベースの別の場所にあるフルテキストインデックステーブルにコピーするための例を紹介します:

init.py#L269 "> https://github.com/mitechie/Bookie /ブロブ/マスター/ブッキー/モデル/ のinitの.py#L269

だからあなたのマッパーの拡張子が

class DataSHAExtension(MapperExtension): 
    def before_insert(self, mapper, connection, instance): 
     instance.checksum = hashlib.sha1(instance.data).hexdigest() 
    ... 

ようになり、その後、releventモデルにattchedかもしれません:

Class Something(Base): 
    __tablename__ = 'something' 
    __mapper_args__ = { 
     'extension': DataSHAExtension() 
    } 

これは宣言的なやり方です。手動マッパーコマンドでもこれを行うことができます。

+0

また、SqlAlchemy 0.7は完全なイベントベースにリファクタリングされています。そのことを確認できます。http://www.sqlalchemy.org/docs/orm/events.html – Rick

+0

非常に便利な拡張機能 - 多くの感謝! – Escualo

関連する問題