SQLAlchemy set default value of one column to that

2019-06-15 18:26发布

I am trying to write a class for substances which has a name filed (for the name, as commonly used in the lab) and another column for the long name (in case the name is actually incomplete). Is there some wy to tell the class to just copy the value of the name field to the long name field in case a long name is not specified?

I tried something like this:

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)

But this fails, since name is undefined. Is there anything else I could do?

2条回答
ゆ 、 Hurt°
2楼-- · 2019-06-15 18:38

In addition to r-m-n's answer if you have more than one column that defaults to value of another one, you can write a helper function to avoid writing many default functions.

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'))
查看更多
倾城 Initia
3楼-- · 2019-06-15 18:50

You can create 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)
查看更多
登录 后发表回答