【问题标题】:SQLAlchemy how to check if a loaded objects attributes are equal to the column defaultSQLAlchemy如何检查加载的对象属性是否等于列默认值
【发布时间】:2018-06-12 16:15:07
【问题描述】:

我有一些表类,我将不断地向其中添加属性。我想编写一个函数 upToDate() 如果没有列是 MySQL 默认值,它将返回 True,如果是,则返回 False。例如,我的表格如下所示:

class League(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    numTeams = db.Column(db.Integer, nullable=False)

我加载 League id 1,它已经填充了所有值,所以它返回 True。后来,我将英雄联盟更新为如下所示:

class League(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    numTeams = db.Column(db.Integer, nullable=False)
    firstYear = db.Column(db.Integer, nullable=False)

我运行 migrate() 和 update() 将新列添加到数据库中。现在当我加载 League id 1 时,firstYear 属性将为 0,这是默认值,这意味着它需要更新。

【问题讨论】:

    标签: python mysql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我在 SQLAlchemy 文档中找到了 inspect() 函数,它为我解决了这个问题。

    Documentation

    def upToDate(tableObject):
        defaults = {"INTEGER" : 0, "VARCHAR(128)" : ""} #could enter more data types here as necessary
        mapper = inspect(tableObject.__class__)
        for col in mapper.columns:
            name = col.name
            type = str(col.type)
            currentValue = tableObject.__getattribute__(name)
            if defaults[type] == currentValue:
                return False
        return True
    

    【讨论】:

    • 什么是col.default.arg? ;)
    • 我想我错过了你的问题的重点。我的问题或答案中的col.default.arg 在哪里?
    • 不是这样,您可以通过这种方式访问​​默认值(而不是在 defaults 字典中硬编码默认值)。
    • 经过一番思考,如果您在模型定义中使用 default=0,这将起作用
    猜你喜欢
    • 2019-03-19
    • 2011-09-27
    • 1970-01-01
    • 2019-02-23
    • 2016-08-15
    • 2015-07-21
    • 2013-10-20
    • 2013-09-06
    • 1970-01-01
    相关资源
    最近更新 更多