自动将列的SHA-1校验和添加为SQLAlchemy表中的另一列

时间:2011-06-01 17:45:21

标签: python sqlalchemy

我正在使用SQLAlchemy数据库。

我有一个包含iddatatimestamp列的简单架构。 timestamp列会自动填充当前日期/时间,如下所示:

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

我想添加另一个包含data列的SHA-1校验和的列。有点像:

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

有什么建议吗?

谢谢。

编辑:

我最接近的是管理对象级别的“自动化”(而不是表级)。我只是将checksum列定义为

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

并将映射到该表的对象的构造函数修改为:

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

它按预期工作,但我仍然想知道是否有办法在“表”级别执行此操作(如在timestamp中,我在对象级别不执行任何操作,但正确分配当前日期/时间)

1 个答案:

答案 0 :(得分:2)

SqlAlchemy MapperExtension允许您为事件创建代码端触发器/挂钩。

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

基本上你想要创建一个执行额外操作的before_insert和before_update。我有一个例子来帮助确保我将内容从一列复制到数据库中其他地方的全文索引表中:

init.py#L269" > HTTPS://github.com/mitechie/Bookie/blob/master/bookie/models/的初始化的.py#L269

因此,您的映射器扩展名可能类似于

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

然后加入相关模型:

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

这是以声明方式做事。您也可以使用手动映射器命令执行此操作。