用于在插入和更新时创建复合值的SQLAlchemy上下文相关函数

问题描述 投票:3回答:2

我正试图弄清如何添加上下文敏感函数(例如def get_user_full_name()),该函数将从列的默认规范和onupdate规范触发。我试图设置一个将姓氏和名字组合成单个全名值的复合字段,以避免在所有查询中始终不断合并这两个字段。

我正在使用声明式方法。这是类似模型的示例:

class SomeMembers(Base):
    __tablename__ = 'some_members'
    __table_args__ = {'mysql_engine':'InnoDB'}

    SomeGroup = Column(Unicode(50), primary_key=True)
    UserID = Column(Unicode(50), primary_key=True)
    FullName = Column(Unicode(255), default=get_user_full_name, onupdate=get_user_full_name, index=True)
    FirstName = Column(Unicode(255), index=True)
    LastName = Column(Unicode(255), index=True)
    UserName = Column(Unicode(255))

这是我编写的函数,它在堆栈跟踪中报告FirstName或LastName密钥均无效:

def get_user_full_name(context):
    return " ".join((context.compiled_parameters[0]['FirstName'],context.compiled_parameters[0]['LastName']))

我不清楚如何引用现有数据的两列(FirstName和LastName)来创建一个复合值以进行存储以方便检索。例如,如果我有一个名为John Doe的用户,则get_user_full_name方法应采用“ John”和“ Doe”,并返回全名值“ John Doe”。

documentation中,它指的是context.current_parameters,但在我的情况下不存在。我怀疑是因为我们使用了声明式方法。如果可以,我的get_user_full_name函数将如下所示:

def get_user_full_name(context):
    return " ".join((context.current_parameters['FirstName'],context.current_parameters['LastName']))

我知道这可能是微不足道的,但我似乎无法破解有关此信息的存储位置以及如何动态访问它的代码。

一点见识将不胜感激。我也愿意采用更优雅的方法。

提前感谢...

干杯,

保罗

python orm model sqlalchemy declarative
2个回答
0
投票

我尝试了以下表达式:

from sqlalchemy.sql.expression import column, literal, literal_column

Column('full_name', String, onupdate=literal_column("first_name") + literal(" ") + literal_column("last_name"))

这是可行的,但是用full_namefirst_name的先前值更新last_name。使用column会得到相同的结果。

composite列会做这项工作吗?


0
投票

以防万一有人在寻找答案。

您可以使用mapper-events

@event.listens_for(SomeMembers, 'before_insert')
def before_insert_function(mapper, connection, target):
        target.FullName = f"{target.FirstName} {target.LastName}"
© www.soinside.com 2019 - 2024. All rights reserved.