【问题标题】:How to set the default value of a column in sqlalchemy to the value of a column from a relationship?如何将sqlalchemy中列的默认值设置为关系中列的值?
【发布时间】:2019-04-27 02:29:19
【问题描述】:

我正在为 sqlite 数据库设置 Sqlalchemy 映射器。我的 User 类与我的 Team 类具有不可为空的关系。我已有的代码如下:

class Team(Base):
    __tablename__ = 'teams'

    team_id = Column(Integer, primary_key=True)
    # Using Integer as holder for boolean
    is_local = Column(Integer, default=0)

class User(Base):
    __tablename__ = 'users'

    user_id = Column(Integer, primary_key=True)
    team_id = Column(Integer, ForeignKey(Team.team_id), default=1, nullable=False)
    team = relationship('Team')
    is_local = Column(Integer, default=0)

我想确定User.is_local 的值默认为用户链接团队的Team.is_local 值。 但是,在创建用户之后,我仍然希望能够修改用户的 is_local 值,而无需更改团队或团队中任何其他用户的值。

所以如果我要执行

faraway = Team(is_local=1)
session.add(faraway)
session.commit()

u = User(team=faraway)
session.add(u)
session.commit()

print(bool(u.is_local))

结果应该是True

到目前为止,我已经按照https://stackoverflow.com/a/36579924 的建议尝试了上下文相关的默认函数,但我还没有找到允许我引用Team.is_local 的语法

有没有简单的方法来做到这一点?

【问题讨论】:

  • 也许您可以尝试使用 sql 表达式作为默认值,以便在插入时从 team 表中选择值,请参阅:docs.sqlalchemy.org/en/13/core/…;或者也许使用事件侦听器来挂钩诸如before_flush 之类的事件,以便在实例进入数据库的过程中将状态添加到实例中。请参阅:docs.sqlalchemy.org/en/13/orm/…。很抱歉,因为我在打电话,所以没有写正式的答案,但我想我会分享一些可能有助于让你感动的想法。
  • @SuperShoot 第一个建议似乎有效。我被示例中的拼写错误(单个 = 而不是 ==)难住了

标签: python sqlalchemy


【解决方案1】:

SuperShoot 的第一个建议,使用sql expression as the default 似乎有效。具体来说,

    is_local = Column(Integer, default=select([Team.is_local]).where(Team.team_id==team_id))

给出了我需要的逻辑。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2016-08-03
    • 2019-06-21
    • 2016-12-22
    • 2015-01-31
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多