Flask-SQLAlchemy更新整个对象

医生

我想知道是否有更短的方法来更新整个对象,
假设我有一个这样声明的对象“ Package”:

class Package(db.Model):
    __searchable__ = ['name','version','maintainer','uploaders']
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(80))
    version = db.Column(db.String(15))
    architecture = db.Column(db.String(255))
    maintainer = db.Column(db.String(255))
    sha256 = db.Column(db.String(200))
    sha1 = db.Column(db.String(50))
    md5sum = db.Column(db.String(50))
    depends = relationship('Package',
                           secondary=package_to_package,
                           primaryjoin=id==package_to_package.c.left_package_id,
                           secondaryjoin=id==package_to_package.c.right_package_id,
                           backref='neededBy')
    recommends = relationship('Package',
                           secondary=package_recommended,
                           primaryjoin=id==package_recommended.c.left_package_id,
                           secondaryjoin=id==package_recommended.c.right_package_id,
                           backref='recommendedBy')
    lastUpdate = db.Column(db.DateTime)
    distributionId = db.Column(db.Integer,db.ForeignKey('distribution.id'))
    componentId = db.Column(db.Integer,db.ForeignKey('component.id'))
    status = db.Column(db.String(50))
    format = db.Column(db.String(25))
    uploaders = db.Column(db.String(255))
    def __init__(self,name):
        self.name = name
        self.lastUpdate = datetime.utcnow()

    def __repr__(self):
        return '<Package : %r Version : %r Maintainer : %r componentId : %d >' % (
            self.name,
            self.version,
            self.maintainer,
            self.componentId)

我有一个更新这些对象的芹菜任务,我更新该对象的第一种方法是:

 if isinstance(package, Package):
                # Check if Distribution already Exists
                recordedPackage = Package.query.filter_by(name=package.name,
                                                            distributionId=package.distributionId,
                                                            componentId=package.componentId).first()
                app.logger.debug("Does it already Exists ?")
                if recordedPackage is None:
                    package.depends = packagesNeeded
                    db.session.add(package)
                elif isinstance(recordedPackage,Package) :
                    app.logger.info("updating %r"%(recordedPackage))
                    recordedPackage = package
                    db.session.commit()

这种方法不会更新任何内容,因此我必须这样做:

elif isinstance(recordedPackage,Package) :
                    app.logger.info("updating %r"%(recordedPackage))
                    recordedPackage.version = package.version
                    recordedPackage.depends = packagesNeeded
                    recordedPackage.maintainer = package.maintainer
                    recordedPackage.md5sum = package.md5sum
                    recordedPackage.sha1 = package.sha1
                    recordedPackage.sha256 = package.sha256
                    recordedPackage.lastUpdate = datetime.utcnow()
                    [...]
                    db.session.commit()

这样做确实是动态的或干净的。
有没有办法更新整个对象(当然没有ID)?
谢谢你的遮阳篷

医生

最后,我将dir方法与getattr / setattr结合使用,
update在GG_Python建议的类中实现一个方法,该方法
的确如下所示:

 def update(self,newPackage):
    newPackageAttributes = [a for a in dir(newPackage) if not a.startswith('__')]
    for key in newPackageAttributes:
        try:
            if getattr(self,key) != getattr(newPackage, key) \
                    and key != 'id'\
                    and key != 'name':
                if type(getattr(newPackage, key)) == str:
                    setattr(self,key,getattr(newPackage, key))
        except AttributeError:
            app.logger.debug("attribute not found, no pb")
    self.lastUpdate = datetime.utcnow()

这样,我不更新InstanceState等,
我可以稍后再添加一些检查(例如名称应相同,等等...)
,这在解析包的方法上给了我类似的东西:

recordedPackage = Package.query.filter_by(name=package.name,
                                        distributionId=package.distributionId,
                                        componentId=package.componentId).first()
app.logger.debug("Does it already Exists ?")
if recordedPackage is None:
    package.depends = packagesNeeded
    db.session.add(package)
elif isinstance(recordedPackage,Package) :
    app.logger.info("updating %r"%(recordedPackage))
    recordedPackage.update(package)

db.session.commit()

谢谢您的建议

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何按需定义flask-sqlalchemy对象?

来自分类Dev

使用 Flask SQLAlchemy 更新特定行

来自分类Dev

如何更新 Flask-SQLAlchemy 关联表?

来自分类Dev

Flask-sqlalchemy在整个会话中禁用自动刷新

来自分类Dev

Flask SQLAlchemy分页错误

来自分类Dev

Flask SQLAlchemy关系

来自分类Dev

Flask-SQLAlchemy TimeoutError

来自分类Dev

Flask/SQLAlchemy Insert Into Database

来自分类Dev

Flask + SqlAlchemy ALTER表

来自分类Dev

Flask SQLAlchemy关系

来自分类Dev

无法安装Flask SQLAlchemy

来自分类Dev

AttributeError:使用Flask SqlAlchemy,“ tuple”对象没有属性“ drivername”

来自分类Dev

Flask SQLAlchemy:属性错误:“函数”对象没有“翻译”属性

来自分类Dev

Flask-SQLAlchemy更新一对多记录

来自分类Dev

Flask SQLAlchemy以DRY代码更新用户信息

来自分类Dev

如何在Flask SQLAlchemy中更新布尔值

来自分类Dev

Flask-SQLAlchemy使用request.form更新行

来自分类Dev

Flask-SQLAlchemy:更新一对多关系

来自分类Dev

Flask-SQLAlchemy 不保存数据库更新

来自分类Dev

Flask jsonify对象列表

来自分类Dev

PyCharm解析-flask.ext.sqlalchemy与flask_sqlalchemy

来自分类Dev

SqlAlchemy Flask中的列参数

来自分类Dev

Flask-SQLAlchemy的隔离级别

来自分类Dev

用Flask-SQLAlchemy查询

来自分类Dev

Flask-SQLAlchemy-大于或等于

来自分类Dev

Flask sqlalchemy-最小应用

来自分类Dev

从flask_sqlalchemy导入UniqueConstraint

来自分类Dev

Flask SQLAlchemy order_by关系

来自分类Dev

Flask-SQLAlchemy多对多