2012-12-20 15 views
1

林發送SQLAlchemy的對象槽淨到另一臺機器。首先,我將它序列化爲一個字符串,然後加密併發送。SQLAlchemy的串行合併

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker, scoped_session 
from sqlalchemy.ext.serializer import loads, dumps 
engine = create_engine(connection_str) 
S = scoped_session(sessionmaker(bind=engine, expire_on_commit=False)) 
session = S() 

data = session(MyObj).all() 
serialized = pickle.dumps([dumps(d) for d in data]) 

crypted = crypt(serialized) #encrypting the serialized data 
send(machine, crypted)  #sending encripted data to 'machine' 

,並在另一臺機器上: 我與序列化

encrypted = get_data() 
serialized = decrypt(encrypted) 
data = [loads(d, Base.metadata, S) for d in pickle.loads(serialized)] 

for d in data: 
    session.merge(d) 
session.commit() 

但它拋出:(IntegrityError) node_type.id may not be NULL u'INSERT INTO myobj (col1, col2) VALUES (?, ?)' (None, None)

,當我嘗試打印data它拋出:DetachedInstanceError Instance <MyObj at 0x24e0c70> is not bound to a Session; attribute refresh operation cannot proceed 或:ObjectDeletedError

是什麼問題?

這裏: How to create and restore a backup from SqlAlchemy?被告知session.merge()會很好,但它沒有爲我工作。

回答

1

從文檔爲sqlalchemy.ext.serializer

「串行器模塊是僅適用於查詢結構是 不需要[...]用戶定義的類的實例。」

也許嘗試只使用pickle而不是sqlalchemy.ext.serializer用於此用例。

+0

確定現在它的作品!我用'pickle'(不是'sqlalchemy.ext.serializer'),但我的對象(表)必須有''__getstate__'方法__setstate__'這些方法都必須列初始化 – microo8

+0

其實我看到你以前的評論,你說它沒有工作,並做了一些研究。如果您在調用'dumps()'之前從會話中清除對象,可能不需要'__getstate__'和'__setstate__'。我還沒有測試過。 –

+0

清除不起作用 – microo8