gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:10:28 26 4
gpt4 key购买 nike

我正在使用 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 中,我在对象级别不执行任何操作,但正确)分配当前日期/时间)

最佳答案

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

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/init.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()
}

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

关于python - 自动将一列的 SHA-1 校验和添加为 SQLAlchemy 表中的另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com