2011-08-30 3 views
0

좋아, 그래서 여기에 약간의 문제가 있습니다. 일부 sqlalchemy에 대해 일종의 가져 오기/내보내기 기능을 만들 수 있어야합니다. 이제이 그래서 내가 뭘 열을 얻기 위해, 내가 정의있어 개체 수 없습니다 : 일부 sqlalchemy 개체 다시 만들기

for attr, value in res.__class__.__dict__.iteritems(): 
    if isinstance(value, InstrumentedAttribute): 
      data = eval("res." + str(attr)) 
      param_dict[attr] = data 

지금이 올바르게 나에게 해당 개체의 속성을 가져옵니다. 그러나 나는이 객체를 다루는 사람이 아니기 때문에 의 매개 변수가 동일하다는 것을 확신 할 수 있습니다. 초기화가 받았다으로

class SomeClass(model.Base): 
    my_column = Column(String) 
    ....some other stuff... 

    def __init__(self, mycolumn, ...): 
      self.my_column = mycolumn 

이 경우에 I 필드의 이름과 매개 변수의 이름 사이에 correspondance에없는 : 그래서 같은 상황이있을 수 있습니다. 나는 현재이 클래스를 정의하는 사람이 디폴트 값을 모두 초기화 parametes을 가지고 contraining있어 그래서 난 그냥 수 : 내가 좋아하는 것 그러나

obj = SomeClass() 
exec "obj." + attr + " = " + param[attr] 

도이 구속에서 멀리 얻을 수 있습니다. 내가 이것을 성취 할 수있는 방법이 있습니까?

+1

1. 이유는 무엇입니까? 2. 피클을 사용하십시오. 3. 절대적으로 필요하지 않는 한 eval을 사용하지 마십시오. 여기 getattr/setattr로 충분합니다. –

+0

가져 오기/내보내기 개체 메커니즘을 만드는 또 다른 방법이 없기 때문에. pickle은 sqlalchemy 오브젝트로 작동합니까? – Bogdan

+0

pickle에는 모든 유형의 객체를 다루는 프로토콜이 있습니다. –

답변

4

가능한 모든 sqlalchemy 매핑 된 클래스에 대해 직렬화를 실제로 일반화 할 수 없으며 클래스에 데이터베이스에 저장되지 않은 속성이 있거나 relationship 속성을 통해 여러 수준의 간접 참조에서 유추해야합니다. 간단히 말해서, 당신은 오직 특정 용도로 특정 클래스를 직렬화하는 방법을 알고 있습니다.


경우에만 필요하거나 ( res에) 고려중인 특정 클래스의 특정 인스턴스에 대한 열 값에 대해 신경 척 할 수 있습니다. 다음은 그 값만 포함하는 dict을 반환하는 원시 함수입니다.
from sqlalchemy.orm.attributes import manager_of_class 
from sqlalchemy.orm.properties import ColumnProperty 

def get_state_dict(instance): 
    cls = type(instance) 
    mgr = manager_of_class(cls) 
    return dict((key, getattr(instance, key)) 
       for key, attr in mgr.iteritems() 
       if isinstance(attr.property, ColumnProperty)) 

은 DICT에서 인스턴스를 다시 *

def create_from_state_dict(cls, state_dict): 
    mgr = manager_of_class(cls) 
    instance = mgr.new_instance() 
    for key, value in state_dict.iteritems(): 
     setattr(instance, key, value) 
    return instance 

당신은 아마 (다 대다 관계 등) 열로 표시되지 관계를 처리, 뭔가 더 복잡한해야하는 경우를 이 경우를 sqlalchemy.orm.properties.RelationshipProperty을 찾고 컬렉션을 반복하여 추가 할 수 있습니다.

* 중간 dict 및 클래스를 직렬화하는 것이 연습으로 남아 있습니다.