如何使用SQLAlchemy根据其他列计算一个列的值?

5

我在Python代码库中使用SQLAlchemy作为ORM,以便能够连接到MySQL数据库。我想根据同一行中其他列的值自动计算并插入一个列中的值。

以下是我的类的样子:

class SentNotification(Base):
    __tablename__ = 'sent_notification'

    campaign = Column(VARCHAR(34), nullable=False)
    alert_type = Column(VARCHAR(34), nullable=False)
    identifier = Column(VARCHAR(34), nullable=False)
    message_params = Column(JSON, nullable=True)
    send_time = Column(Integer, nullable=False)
    nonce = Column(VARCHAR(32), nullable=False, primary_key=True)
nonce列应该是campaignalert_typeidentifiermessage_params(json dump)的md5哈希值(或任何其他自定义函数)。
明显可以单独计算此值并使用SentNotification调用nonce,但如果只传入前5个值,我的类会自动处理计算和插入nonce,那将更加简洁。
注意:我不想使用混合属性(hybrid property),因为它仅计算值,而我实际上想要在数据库中持久化nonce

看一下上下文敏感默认函数,这应该是你要找的。基本上,你可以定义一个函数来计算一个列的默认值,并在插入时访问其他被插入的值。 - SuperShoot
这是相关的内容:https://dev59.com/81oV5IYBdhLWcg3wL8Sw - SuperShoot
此外,我相信MySQL有计算/生成列,包括实体化和非实体化的。值得一看。 - Ilja Everilä
1个回答

0

这是关于上下文敏感的默认函数的。你可以这样使用它:

def mydefault(context):
    params = context.get_current_parameters()
    return hash(params['campaign'],params['alert_type'],params['identifier'], params['message_params'])

class SentNotification(Base):
    __tablename__ = 'sent_notification'

    campaign = Column(VARCHAR(34), nullable=False)
    alert_type = Column(VARCHAR(34), nullable=False)
    identifier = Column(VARCHAR(34), nullable=False)
    message_params = Column(JSON, nullable=True)
    send_time = Column(Integer, nullable=False)
    nonce = Column(VARCHAR(32), nullable=False, primary_key=True, default=mydefault)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接