繁体   English   中英

SQLAlchemy-复制记录,更新一列,并另存为新记录

[英]SQLAlchemy - Copy records, update one column, and save as new records

使用SQLAlchemy,我只是试图查询一组记录,如下所示

session.query(MyTable).filter_by(foreign_id=413).all()

然后,我只需要复制这些记录,更改foreign_id ,然后将它们保存为与新记录相同的表。 我现在想不出一种有效的方法来做到这一点。 我想到的唯一一件事是循环遍历结果集,创建除foreign_id之外还共享所有相同属性的新记录,然后批量保存这些新记录。

确保原始记录完好无损,因此简单地更新行不是一个选择。

如果有帮助,这里实际上是MyTable对象

class MyTable(Base):
    __tablename__ = 'my_table'

    id = Column(Integer, primary_key=True)
    col_a = Column(String(64))
    col_b = Column(String(64))
    foreign_id = Column(Integer, ForeignKey('other_table.id'))

在此示例中,我想保持col_acol_b相同,但是要更新foreign_idid列。

如果您使用的是Django ORM,则可以简单地将id字段设置为None并保存它,并创建复制的记录(假设主id字段是自动生成的)。

使用SQLAlchemy,这将行不通,或者从纯SQL术语来看也没有意义。 实现这一目标的有效且可扩展的方法是:

from sqlalchemy.orm import class_mapper

recs = session.query(MyTable).filter_by(foreign_id=413).all()
for rec in recs:
    newrec = MyTable()
    for item in [p.key for p in class_mapper(MyTable).iterate_properties]:
        if item not in ['id', 'foreign_id']:
            setattr(newrec, item, getattr(rec, item))
    # assign foreign field as appropriate...
    session.add(newrec)
    session.commit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM