我有一个使用烧瓶炼金术的下表:

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

我想使用autoincrementd id字段创建一个散列。我从其他问题中看到db.session.flush()可以使用,但是这不起作用,因为我最好从init内部获取id。
上面使用self.id的代码将不起作用,因为self.id返回一个nonetype。是否有方法获取将从init内部生成的id?谢谢。

最佳答案

documentation声明在发出该实体的self.id语句之前不会设置INSERT属性。这意味着:除非在INSERT方法中不发出__init__语句,否则无法在那里获得自动递增的值。
我不知道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

关于python - SQLAlchemy:从初始化程序获取值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37908935/

10-08 21:15