我有以下示例表:
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))
但是,如何将记录从一个表转移到另一个表?我想我可以查询源表,遍历每条记录,将其转换成字典,然后如上所述添加结果。但是,我确定必须有一个更整洁的解决方案?
源数据库中将有name
和place
记录的重复组合,因此,除非它不会插入任何重复的记录,否则我不希望使用任何类型的批量操作。
让我们假设源数据库看起来像这样:
class SourceDB(Base):
__tablename__ = "source_db"
id = Column(Integer, primary_key=True)
name = Column(String(100))
place = Column(String(100))
我只想转移name
和place
字段。
答案 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"))))