sqlalchemy序列化器合并

时间:2012-12-20 11:37:00

标签: python database serialization 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 个答案:

答案 0 :(得分:1)

来自sqlalchemy.ext.serializer的文档:

  

“序列化程序模块仅适用于查询结构。它是   [...]用户定义类的实例不需要“

也许只是尝试使用pickle而不是sqlalchemy.ext.serializer用于此用例。