【问题标题】:SQLAlchemy context sensitive function for creating a composite value on insert and updateSQLAlchemy 上下文相关函数,用于在插入和更新时创建复合值
【发布时间】:2011-04-08 14:29:01
【问题描述】:

我正在尝试解决如何添加上下文相关函数(例如 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


    【解决方案1】:

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

    您可以使用mapper-events

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

    【讨论】:

      【解决方案2】:

      我尝试了以下表达式:

      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_name 和last_name 的先前值。使用 column 会产生相同的结果。

      composite 栏可以完成这项工作吗?

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 2013-11-20
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多