【问题标题】:Creating a Function That Automaticaly Knows Whether to Insert or Update in Flask, SqlAlchemy, Python在 Flask、SqlAlchemy、Python 中创建一个自动知道是插入还是更新的函数
【发布时间】:2023-03-17 22:47:01
【问题描述】:

我目前有两个单独的代码部分,一个将一个全新的行插入到 mySQL 数据库中。如果行已经存在,第二个只会更新一行。

我正在尝试将这两者组合成一个函数,该函数自动检查 id 是否在表中,如果是,则更新,否则插入新行?这是我目前所拥有的:

class Example(db.Model):
        __tablename__ = 'schools'
        _id = db.Column('_id', db.Unicode, primary_key=True)
        establishmentNumber = db.Column('establishmentNumber', db.Unicode)
        laCode = db.Column('laCode', db.Unicode)
        urn = db.Column('urn', db.Unicode)
        name = db.Column('name', db.Unicode)
        phaseOfEducation = db.Column('phaseOfEducation', db.Unicode)
        wondeID = db.Column('wondeID', db.Unicode)

        def __init__(self, _id, establishmentNumber, laCode, urn, name, phaseOfEducation, wondeID):
            self._id = _id
            self.establishmentNumber = establishmentNumber
            self.laCode = laCode
            self.urn = urn
            self.name = name
            self.phaseOfEducation = phaseOfEducation
            self.wondeID = wondeID

            def add_or_update(cls, _id, establishmentNumber, laCode, urn, name, phaseOfEducation, wondeID):
                entity = cls.query.filter_by(_id=school._id.iloc[0]).first()
                print(entity)

                if not entity:
                    entity = cls(school._id.iloc[0], school.establishmentNumber.iloc[0], school.laCode.iloc[0], school.urn.iloc[0], school.name.iloc[0], school.phaseOfEducation.iloc[0], school.wondeID.iloc[0])
                    db.session.add(entity)
                    db.session.commit()

                else:
                    entity.establishmentNumber = 'hello'
                    db.session.commit()
                    print (entity.establishmentNumber)

                return entity

它不会产生任何错误,但它也不会添加或更新。谁能看到我做错了什么?

【问题讨论】:

    标签: python mysql flask-sqlalchemy


    【解决方案1】:

    你有缩进错误。像这样重新缩进:

    def __init__(self, _id, establishmentNumber, laCode, urn, name, phaseOfEducation, wondeID):
        self._id = _id
        self.establishmentNumber = establishmentNumber
        self.laCode = laCode
        self.urn = urn
        self.name = name
        self.phaseOfEducation = phaseOfEducation
        self.wondeID = wondeID
    
    @classmethod
    def add_or_update(cls, _id, establishmentNumber, laCode, urn, name, phaseOfEducation, wondeID):
        entity = cls.query.filter_by(_id=school._id.iloc[0]).first()
        print(entity)
    
        if not entity:
            entity = cls(school._id.iloc[0], school.establishmentNumber.iloc[0], school.laCode.iloc[0],
                         school.urn.iloc[0], school.name.iloc[0], school.phaseOfEducation.iloc[0],
                         school.wondeID.iloc[0])
            db.session.add(entity)
            db.session.commit()
    
        else:
            entity.establishmentNumber = 'hello'
            db.session.commit()
            print(entity.establishmentNumber)
    
        return entity
    

    【讨论】:

    • 感谢@IamMashed。我刚刚修复了缩进。但它现在仍然有效。没有错误,但也没有添加/更新
    • 尝试添加@classmethod
    • 感谢@IamMashed - 现已修复
    • 非常感谢@IamMashed 的帮助。它现在工作得很好,但速度很慢。插入 150,000 行需要 30 分钟。你知道我怎样才能加快速度吗?是我的承诺方式让它变慢了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2016-10-16
    相关资源
    最近更新 更多