Python SQLAlchemy上下文敏感函数,用于在插入和更新时创建复合值

Python SQLAlchemy上下文敏感函数,用于在插入和更新时创建复合值,python,orm,model,sqlalchemy,declarative,Python,Orm,Model,Sqlalchemy,Declarative,我试图找出如何添加上下文敏感函数(例如def get_user_full_name()),该函数将从列上的默认和onupdate规范触发。我试图设置一个复合字段,将名字和姓氏组合成一个完整的名称值,以避免在所有查询中不断地合并这两个字段 我使用的是声明式方法。这是一个类似模型的示例: class SomeMembers(Base): __tablename__ = 'some_members' __table_args__ = {'mysql_engine':'InnoDB'}

我试图找出如何添加上下文敏感函数(例如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)现有数据来创建一个复合值来存储以便于检索。例如,如果我有一个名为johndoe的用户,那么get_user_full_name方法应该取“John”和“Doe”,并返回一个全名值“johndoe”

在中,它指的是context.current_参数,但在我的示例中不存在。我怀疑这是因为我们使用声明式方法。如果它真的起作用,我的get_user_full_name函数将如下所示:

def get_user_full_name(context):
    return " ".join((context.current_parameters['FirstName'],context.current_parameters['LastName']))
我知道这可能很琐碎,但我似乎无法破解这些信息存储在何处以及如何动态访问这些信息的代码

如果您有一点见解,我们将不胜感激。我也对更优雅的方法持开放态度

先谢谢你

干杯


保罗

我尝试了以下表达:

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

Column('full_name', String, onupdate=literal_column("first_name") + literal(" ") + literal_column("last_name"))
它在某种程度上可以工作,但会使用以前的值
first\u name
last\u name
更新
全名。使用
可以得到相同的结果


专栏可以胜任吗?

以防有人在寻找答案

你可以用

@event.listens_for(SomeMembers, 'before_insert')
def before_insert_function(mapper, connection, target):
        target.FullName = f"{target.FirstName} {target.LastName}"