SQLAlchemy列值基于另一个

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy列值基于另一个相关的知识,希望对你有一定的参考价值。

我想知道是否可以根据SQLAlchemy中同一个表中的其他值来计算列值。

这是我的例子:

from uuid import uuid4
from datetime import datetime

from sqlalchemy import Column, String, DateTime, UniqueConstraint
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


def generate_uuid():
    return str(uuid4())


class User(Base):
    __tablename__ = 'users'
    __table__args__ = (UniqueConstraint('username', 'email_address', 'phone'),)

    user_id = Column(String(36), primary_key=True, unique=True, default=generate_uuid)
    username = Column(String(15), nullable=False)
    password = Column(String(25), nullable=False)

    email_address = Column(String(255), nullable=False)
    phone = Column(String(20), nullable=False)

    hash = Column(String(128), nullable=False, unique=True)

    created_on = Column(DateTime(), default=datetime.utcnow)
    updated_on = Column(DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)

我想要实现的是每当hashusernameemail_address被修改(更新)时重新计算phone列。

这可能使用sqlalchemy.event.listen_for吗?如果是,当hash依赖于多列时,是否可以使用它?

答案

您可以在sqlalchemy http://docs.sqlalchemy.org/en/latest/orm/events.html#mapper-events中使用mapper-events

before_update结束before_insert然后你可以在:)之前编辑你的实例

例:

def before_insert_function(mapper, connection, target):
    # 'target' is your object
    print(target.user_id )
    print(target.password)
    target.hash = "Other"
event.listen(User, 'before_insert', before_insert_function)

要么

@event.listens_for(User, 'before_update')
def before_insert_function(mapper, connection, target):
        # 'target' is your object
        print(target.user_id )
        print(target.password)
        target.hash = "Other"

以上是关于SQLAlchemy列值基于另一个的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy,使用反向包含(不在)子列值列表中进行选择

为啥在提交对象之前 SQLAlchemy 默认列值不可用?

laravel 基于另一列值的唯一验证规则

如何基于另一列值透视数据

Sqlalchemy 使用 map func 返回列值

基于另一列的每个值的列值总和,然后除以总数