2012-02-22 104 views
4

我想將對象從一個數據庫移動到另一個數據庫。映射是相同的,但表格是不同的。這是一個合併工具,需要將舊數據庫中的數據導入到新數據庫中。不過,我想我在這裏錯過了一些關於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

我沒有真正意識到對引擎蓋下會發生什麼,但在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不立即關閉能夠在創建新對象時讀取原始對象屬性。

+0

是的,我想避免這樣做,因爲它看起來不雅觀。啊... – Sardathrion 2012-02-22 10:25:42

+1

問題是如何在表格之間進行復制。如果SQLAlchemy無法執行簡單的表副本,或者您不知道如何執行該操作,請直接說出來。 – 2016-01-15 19:11:19

相關問題