简体   繁体   English

如何在使用同一模型的不同数据库之间迁移数据?

[英]How can I migrate data between different databases that use the same model?

I would like to migrate some data between two databases that share the same model. 我想在共享同一模型的两个数据库之间迁移一些数据。 Here is my code: 这是我的代码:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()


class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)


# Create engines
source_engine = create_engine('sqlite:///source.db')
mirror_engine = create_engine('sqlite:///mirror.db')

# Create tables
Base.metadata.create_all(bind=source_engine)
Base.metadata.create_all(bind=mirror_engine)

# Create sessions
SourceSession = sessionmaker(bind=source_engine)
source_session = SourceSession()
MirrorSession = sessionmaker(bind=mirror_engine)
mirror_session = MirrorSession()

# Add data
source_session.add(Person(name="James"))
source_session.commit()

# Migrate data
results = source_session.query(Person).all()
for row in results:
    mirror_session.add(row)  # This line produces an error
mirror_session.commit()

# Close sessions
source_session.close()
mirror_session.close()

The migration line mirror_session.add(row) produces the following error: 迁移行mirror_session.add(row)会产生以下错误:

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

Your real use case might not be SQLite, but in case it is, you can perform such a migration without a round trip in Python with attached databases : 您真正的用例可能不是SQLite,但如果是这样,您可以在没有附加数据库的 Python中进行这种迁移而无需往返:

from sqlalchemy import create_engine, MetaData, event
from sqlalchemy import Table, Column, Integer, String

metadata = MetaData()

person = Table('person', metadata,
               Column('id', Integer, primary_key=True),
               Column('name', String(250), nullable=False))

doppelganger = person.tometadata(metadata, schema='mirror')

def attach_mirror(dbapi_conn, connection_rec):
    dbapi_conn.execute("attach database 'mirror.db' as mirror")

engine = create_engine('sqlite:///source.db')
event.listen(engine, 'connect', attach_mirror)

metadata.create_all(engine)

with engine.connect() as conn:
    conn.execute(person.insert().values(name='James'))
    conn.execute(doppelganger.insert().prefix_with('OR IGNORE').
                 from_select(doppelganger.c, person.select()))

Use make_transient() to remove all session information, then you can add it as expected. 使用make_transient()删除所有会话信息,然后可以按预期添加它。

from sqlalchemy.orm import make_transient

results = source_session.query(Person).all()
for row in results:
    mirror_session.add(make_transient(row))
mirror_session.commit()

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

相关问题 如何在同一模型中使用两个不同的模型序列化器? - How Can I Use Two Different Model Serializers With the Same Model? 如何将不同的数据库用于不同的模型 - How can I use different databases for different models 如何在Cherrypy和SQLAlchemy中的同一请求中使用多个数据库? - How can I use multiple databases in the same request in Cherrypy and SQLAlchemy? 如何迁移 flask-sqlalchemy 多个数据库? - How can I migrate flask-sqlalchemy multiple databases? 两个不同的深度学习框架如何使用同一模型? - how can two different deep learning frameworks use the same model? 如何使用python选择不同数据库之间的BLOB并将其插入? - How can I select and insert BLOB between different databases using python? lmdb:我可以在同一个事务中访问不同的命名数据库吗? - lmdb: Can I access different named databases in the same transaction? django - 我不能使用带有 2 个相关数据库的 Q 过滤器模型 - django - I can't use the Q filter model with 2 related databases Django具有相同模型但数据不同的多个数据库 - Django multiple databases with same models but different data 如何使用来自不同脚本的相同导入? - How can I use the same imports from a different script?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM