如何将记录从一个表转移到另一个表?

时间:2020-08-09 10:03:24

标签: python sqlalchemy

我有以下示例表:

class DestDB(Base):
    __tablename__ = "dest_db"
    __table_args__ = (Index('nameplace', "name", "place"))

    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    place = Column(String(100))

我很习惯使用字典来添加记录。例如:

dict = {"name": "foo", "place": "bar"}
session.add(DestDB(**dict))

但是,如何将记录从一个表转移到另一个表?我想我可以查询源表,遍历每条记录,将其转换成字典,然后如上所述添加结果。但是,我确定必须有一个更整洁的解决方案?

源数据库中将有nameplace记录的重复组合,因此,除非它不会插入任何重复的记录,否则我不希望使用任何类型的批量操作。

让我们假设源数据库看起来像这样:

class SourceDB(Base):
    __tablename__ = "source_db"

    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    place = Column(String(100))

我只想转移nameplace字段。

1 个答案:

答案 0 :(得分:1)

我建议坚持使用 Python的禅宗

显式优于隐式。

我将在‍ SourceDB上实现一种方法,以根据需要提供对象的字典格式。

class SourceDB(Base):
    __tablename__ = "source_db"

    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    place = Column(String(100))

    def as_dict(self):
        return dict(name=self.name, place=self.place)

并像这样使用它

session.add(DestDB(**src_obj.as_dict()))

尽管您可以更动态地执行此操作,但我仍然建议您使用更明确的方法。

class SourceDB(Base):
    __tablename__ = "source_db"

    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    place = Column(String(100))

    def as_dict(self, fields):
        return dict(field: getattr(self, field) for field in fields if hasattr(self, field))

然后做

session.add(DestDB(src_obj.as_dict(("name", "place"))))