【问题标题】:SQLAlchemy: getting a value from the initializerSQLAlchemy:从初始化程序中获取值
【发布时间】:2016-10-20 21:46:16
【问题描述】:

我使用 Flask-SQLAlchemy 有下表:

class Posts(db.Model):    
    id = db.Column(db.Integer, primary_key=True)
    hashID = db.Column(db.String(6))
    post = db.Column(db.String(500))

    def __init__(self, post):
        self.hashID = hashid.encode(self.id)
        self.post = post

我想使用自动增量 ID 字段创建哈希。我从其他问题中看到db.session.flush() 可以使用,但这不起作用,因为我最好从init 内部获取ID。

上面使用self.id 的代码将不起作用,因为self.id 返回一个NoneType。有没有办法获取将在init 内部生成的 ID?谢谢。

【问题讨论】:

  • 您可以将self 添加到会话中,然后刷新,但这不是一个好主意。除了自动增量,您还可以提出一个 ID 生成方案,允许应用生成 ID 而不是 DB。
  • @univerio 应用程序内的自动增量似乎很复杂,可能是更简单的解决方案。
  • 我认为问题可能是您覆盖了 db.Model 类的 __init__ 方法。见:stackoverflow.com/questions/3279833
  • 这里是 super 的东西,用于不覆盖类方法:stackoverflow.com/questions/222877.
  • @PSidhu 您不必为您的 ID 使用递增整数。您可以轻松地为您的 ID 生成 UUID,或自定义 ID 生成方案。

标签: python database flask sqlalchemy flask-sqlalchemy


【解决方案1】:

documentation 声明在为该实体发出 INSERT 语句之前不会设置 self.id 属性。这意味着:除非您不在 __init__ 方法中发出 INSERT 语句,否则您无法在那里获得自动递增的值。

我不知道hashid.encode 的功能,但如果该功能没有副作用并且速度很快,那么您根本不需要将该字段存储在数据库中。相反,您可以使用 property 添加它:

class Posts(...):
    self.id = ...
    # other columns here

    @property
    def hashID(self):
        return hashid.encode(self.id)

那么您只需确保在将实体插入数据库之前不访问hashID 属性。

注意:这种方法不会创建列hashID。如果您需要 hashID 作为数据库中的一列,您可以先刷新对象,然后像在 OP 的初始代码中一样设置 hashID。冲洗请看here

【讨论】:

  • 似乎没有持久化到数据库中。
  • @RyanChou 你是对的,hashID 没有存储在数据库中,这在这种情况下很好,因为它只是冗余信息。
  • 是的。您的答案可以满足一些只需要只读的情况。如果我们想保留hashID。我们会尝试其他方式根据自增 ID 生成 Hash 值。
猜你喜欢
  • 2021-01-24
  • 2014-09-27
  • 2020-02-13
  • 1970-01-01
  • 2012-04-03
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多