Невозможно переместить объект из одной базы данных в другую. - PullRequest
4 голосов
/ 22 февраля 2012

Я пытаюсь переместить объект из одной базы данных в другую. Отображения одинаковы, но таблицы разные. Это инструмент слияния, в котором данные из старой базы данных необходимо импортировать в новую. Тем не менее, я думаю, что мне не хватает чего-то фундаментального в SQLAlchemy здесь. Что это?

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

DeclarativeBase = declarative_base()
class Datum (DeclarativeBase):
    __tablename__ = "xUnitTestData"
    Key = Column(String, primary_key=True)
    Value = Column(Float)
    def __init__ (self, k, v):
        self.Key = k
        self.Value = v

src_engine = create_engine('sqlite:///:memory:', echo=False)
dst_engine = create_engine('sqlite:///:memory:', echo=False)
DeclarativeBase.metadata.create_all(src_engine)
DeclarativeBase.metadata.create_all(dst_engine)
SessionSRC = sessionmaker(bind=src_engine)
SessionDST = sessionmaker(bind=dst_engine)
item = Datum('eek', 666)

session1 = SessionSRC()
session1.add(item)
session1.commit()
session1.close()

session2 = SessionDST()
session2.add(item)
session2.commit()
print item in session2 # >>> True
print session2.query(Datum).all() # >>> []
session2.close()

1 Ответ

1 голос
/ 22 февраля 2012

Я на самом деле не в курсе того, что происходит под капотом, но в шаблоне ORM объект соответствует определенной строке в конкретной таблице.Если вы попытаетесь добавить один и тот же объект в две разные таблицы в двух разных базах данных, это не будет хорошей практикой, даже если определение таблицы будет абсолютно одинаковым.

Что бы я сделал, чтобы обойти этопроблема заключается в том, чтобы просто создать новый объект, который является копией исходного объекта, и добавить его в базу данных:

session1 = SessionSRC()
session1.add(item)
session1.commit()

new_item = Datum(item.Key, item.Value)
session2 = SessionDST()
session2.add(new_item)
session2.commit()

print new_item in session2 # >>> True
print session2.query(Datum).all() # >>> [<__main__.Datum object at 0x.......>]
session2.close()
session1.close()

Обратите внимание, что session1 не закрывается сразу, чтобы иметь возможность прочитать атрибуты исходного объектапри создании нового объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...