3

我正在尝试弄清楚如何添加一个上下文相关函数(例如 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']))

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

文档中它指的是 context.current_parameters 但在我的情况下不存在。我怀疑这是因为我们使用了声明性方法。如果它确实有效,我的 get_user_full_name 函数将如下所示:

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

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

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

提前致谢...

干杯,

保罗

4

2 回答 2

1

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

您可以使用映射器事件

@event.listens_for(SomeMembers, 'before_insert')
def before_insert_function(mapper, connection, target):
        target.FullName = f"{target.FirstName} {target.LastName}"
于 2019-11-20T17:17:04.597 回答
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_name的先前值更新。使用产生相同的结果。first_namelast_namecolumn

复合柱能完成这项工作吗?

于 2011-03-02T10:01:16.060 回答