【问题标题】:SQLAlchemy set default value of one column to that of another columnSQLAlchemy 将一列的默认值设置为另一列的默认值
【发布时间】:2016-08-03 10:11:58
【问题描述】:

我正在尝试为具有名称字段(用于名称,如实验室中常用的名称)和另一列用于长名称(以防名称实际上不完整)的物质编写一个类。如果没有指定长名称,是否有一些方法告诉类只将名称字段的值复制到长名称字段?

我尝试过这样的事情:

class Substance(Base):
    __tablename__ = "substances"
    id = Column(Integer, primary_key=True)
    code = Column(String, unique=True)
    name = Column(String, unique=True)
    long_name = Column(String, unique=True, default=name)

但这失败了,因为name 是未定义的。还有什么我可以做的吗?

【问题讨论】:

    标签: python class sqlalchemy


    【解决方案1】:

    您可以创建context-sensitive default function

    def mydefault(context):
        return context.get_current_parameters()['name']
    
    class Substance(Base):
        __tablename__ = "substances"
        id = Column(Integer, primary_key=True)
        code = Column(String, unique=True)
        name = Column(String, unique=True)
        long_name = Column(String, unique=True, default=mydefault)
    

    【讨论】:

    • 看来文档链接已经更新了:return context.get_current_parameters()['name']
    【解决方案2】:

    除了 r-m-n 的答案,如果你有不止一列默认为另一列的值,你可以编写一个辅助函数来避免编写许多默认函数。

    def same_as(column_name):
        def default_function(context):
            return context.current_parameters.get(column_name)
        return default_function
    
    # or as a one-liner
    same_as = lambda col: lambda ctx: ctx.current_parameters.get(col)
    
    class Substance(Base):
        __tablename__ = "substances"
        id = Column(Integer, primary_key=True)
        name = Column(String, unique=True)
        long_name = Column(String, unique=True, default=same_as('name'))
        created = Column(DateTime, default=datetime.now)
        edited = Column(DateTime, default=same_as('created'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多