1

ネット経由で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

何が問題ですか?

こちら: SqlAlchemy からバックアップを作成および復元する方法 session.merge()それは大丈夫だと言われていますが、私にはうまくいきませんでした。

4

1 に答える 1

1

sqlalchemy.ext.serializerのドキュメントから:

「シリアライザーモジュールは、クエリ構造にのみ適しています。[...] ユーザー定義クラスのインスタンスには必要ありません」

このユースケースでは、sqlalchemy.ext.serializer ではなく、pickle だけを使用してみてください。

于 2012-12-20T12:08:52.837 に答える