sqlalchemy将表绑定到多个引擎

时间:2016-06-02 13:18:04

标签: python sqlalchemy

我有两个具有相同架构的不同mysql数据库。 简而言之,我想使用sqlalchemy从一个数据库中读取并将数据插入到另一个数据库中。

到目前为止,这是我的代码

   Base = declarative_base()  
   class Test(Base):
       __tablename__ = 'test'
       ID = Column(Integer,primary_key=True)
       Name = Column(String,nullable=True)
       Updated = Column(Integer)

   sourceEngine  = create_engine(sourceDBString)
   destEngine = create_engine(destDBString)
   Base.metadata.bind = sourceEngine

   SourceSession = sessionmaker()
   SourceSession.bind = sourceEngine
   DestSession = sessionmaker(destEngine)

   source_session = SourceSession()
   destSession = DestSession()
   notupdated = source_session.query(Test).filter_by(Updated=0)

   for row in notupdated:
      row.Updated=1
   destSession.add_all(notupdated)
   destSession.commit() 
   source_session.commit()
   destSession.close()
   source_session.close()

我得到的错误是:

sqlalchemy.exc.InvalidRequestError: Object '<Test at 0x7f7e1a83ce50>' is already attached to session '1' (this is '2')

似乎我只能将对象Test一次绑定到一个引擎,有什么方法可以设置两个引擎来使用它吗?

1 个答案:

答案 0 :(得分:1)

您必须致电make_transient将对象从一个会话转移到另一个会话。您可能还希望通过将obj.id列设置为None来清除required列。

这个问题应该会对你有所帮助。 How to use make_transient() to duplicate an SQLAlchemy mapped object?