SQLAlchemy에서 매핑 된 클래스가 아닌 테이블에서 덤프 및로드 할 수 있습니까?

쿠두 코스

TL; DR 사용 SQLAlchemy의하면 그것은 할 수 dumps(…)load(…) 사용하여 A Table(하지 매핑 클래스 )? 명확히하기 위해, 나는 내 요점 을 밝히기 위해 두 개의 작은 테스트 (현재 빨간색) 를 작성했습니다.


이 매핑 된 클래스 및 세션이있는 경우 :

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.serializer import loads, dumps
from sqlalchemy.orm import mapper, scoped_session
from sqlalchemy.orm.session import sessionmaker


engine = create_engine('sqlite:///:memory:', echo=False)
Base = declarative_base(bind=engine)
session = scoped_session(sessionmaker())



class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    email = Column(String(140), index=True, unique=True)

User매핑 된 클래스를 사용하여 데이터를 덤프하고로드 할 수 있습니다.

>>> # create a record
>>> Base.metadata.create_all()
>>> session.add(User(email='john@alchemydumps'))
>>> session.commit()
>>>
>>> # use dumps
>>> with open('dummy_file', 'wb') as file_handler:
...     file_handler.write(dumps(session.query(User).all()))
...
490
>>>
>>> # reset the database
>>> Base.metadata.drop_all()
>>> Base.metadata.create_all()
>>>
>>> # use loads
>>> with open('dummy_file', 'rb') as file_handler:
...     for row in loads(file_handler.read()):
...         session.merge(row)
...
<__main__.User object at 0x10977ea20>
>>> session.commit()
>>> 
>>> # assert data is back
>>> session.query(User).count()
1
>>>

그러나 Table대신 사용하면 작동 하지 않습니다 .

>>> …
>>>
>>> # use a table instead (User.__table__, instead of User)
>>> with open('dummy_file', 'wb') as file_handler:
...    file_handler.write(dumps(session.query(User.__table__).all()))
...
115
>>> Base.metadata.drop_all()
>>> Base.metadata.create_all()
>>>
>>> with open('dummy_file', 'rb') as file_handler:
...     for row in loads(file_handler.read()):
...         session.merge(row)
...

이 코드는 sqlalchemy.orm.exc.UnmappedInstanceError다음 과 충돌합니다 .

Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "/Users/cuducos/.virtualenvs/alchemydumps/lib/python3.5/site-packages/sqlalchemy/orm/scoping.py", line 157, in do
    return getattr(self.registry(), name)(*args, **kwargs)
File "/Users/cuducos/.virtualenvs/alchemydumps/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 1702, in merge
    object_mapper(instance)  # verify mapped
File "/Users/cuducos/.virtualenvs/alchemydumps/lib/python3.5/site-packages/sqlalchemy/orm/base.py", line 266, in object_mapper
    return object_state(instance).mapper
File "/Users/cuducos/.virtualenvs/alchemydumps/lib/python3.5/site-packages/sqlalchemy/orm/base.py", line 288, in object_state
    raise exc.UnmappedInstanceError(instance)
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'sqlalchemy.util._collections.KeyedTuple' is not mapped

이 메시지는 이미 너무 깁니다. 그래서 저는 probelm의 맥락에 대해 많이 이야기하지 않았습니다. 하지만 매핑되지 않은 클래스를 덤프하고로드해야하는 상황 이 있습니다. 이에 대한 해결책을 찾으려고합니다. ( 면책 조항 : 2 년 전 Python 초보자 였을 때이 패키지를 작성했습니다. 예, 코드가 끔찍해 보이지만 지난 몇 주 동안 완전히 리팩토링했습니다. )

SQLAlchemy에서이 초보자에 대한 아이디어 나 권장 사항이 있습니까?

쿠두 코스

@univerio의 댓글 후에 나는 상황을 더 잘 이해하고 고칠 수있었습니다.

문제는 SQLAlchemy dumpsTable인스턴스를 수신 하면 결과가 테이블과 관련이 없으며 순전히 KeyedTuple. 그래서 나는 :

  1. KeyedTuple로드 되었을 때 매핑 된 클래스 가져 오기
  2. 변환KeyedTuple사전에 (용이 한 바와 같이 KeyedTuple갖는 _asdict()법)
  3. 그런 다음 병합합니다 (원래 의도대로)

테스트는 지금 녹색 , 그러나 이것은 내가 필요로 무엇 요약 :

with open('dummy_file', 'rb') as file_handler:
...     for row in loads(file_handler.read()):
...         if isinstance(row, KeyedTuple):
...             row = User(**row._asdict())
...         session.merge(row)
>>> session.commit()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

템플릿 클래스를 C ++에서 템플릿이 아닌 클래스로 "래핑"할 수 있습니까?

분류에서Dev

sqlalchemy.exc.ArgumentError : 매퍼 매핑 된 클래스가 매핑 된 테이블 'users'에 대한 기본 키 열을 어셈블 할 수 없습니다.

분류에서Dev

엔티티 프레임 워크, 클래스를 키 / 값 테이블에 매핑 할 수 있습니까?

분류에서Dev

엔티티 프레임 워크, 클래스를 키 / 값 테이블에 매핑 할 수 있습니까?

분류에서Dev

메서드가 아닌 클래스 수준에서 메서드를 호출 할 수 있습니까?

분류에서Dev

그것은 글로벌 경로로 스프링 MVC에서 중첩 된 매핑을 매핑 할 수 있습니까?

분류에서Dev

SqlAlchemy에서 매퍼를 사용하여 클래스와 뷰를 매핑 할 수 있습니까?

분류에서Dev

Elasticsearch에서 인덱스 생성 및 데이터로드 후 매핑을 정의 할 수 있습니까?

분류에서Dev

오류를 클래스 래핑 된 Bottle 메서드로 라우팅 할 수 있습니까?

분류에서Dev

다른 메서드에 정의 된 내부 클래스 내에서 최종 변수가 아닌 lblNewLabel을 참조 할 수 없습니다.

분류에서Dev

TypeScript에서 함수 오버로드에서 매핑 된 유형을 유추 할 수 있습니까?

분류에서Dev

ConfigureService 메서드가 아닌 컨트롤러 또는 관리자 클래스에서 서비스를 추가 할 수 있습니까?

분류에서Dev

ps는 Linux에서 커널이 아닌 프로세스 만 표시 할 수 있습니까?

분류에서Dev

weak는 << errortype >>이 아닌 클래스 및 클래스 바인딩 된 프로토콜 유형에만 적용될 수 있습니다.

분류에서Dev

루비 랙업 : 다른 매핑 내에서 프로그래밍 방식으로 매핑을 추가 할 수 있습니까?

분류에서Dev

클래스에`@ objc` 접두사가없는 경우 Objective-C 프로젝트에서 Swift로 작성된 포드를 사용할 수 있습니까?

분류에서Dev

PHPUnit에서 클래스의 일부가 아닌 함수를 어떻게 모의 할 수 있습니까?

분류에서Dev

클래스 인스턴스가 아닌 이벤트에 변수를 어떻게 전달할 수 있습니까?

분류에서Dev

그것은 기존의 엔티티 테이블에, 적은 분야로 새로운 POJO 클래스를 매핑 할 수 있습니까?

분류에서Dev

Java-클래스가 중첩 된 클래스의 개인 필드에 액세스 할 수 있습니까?

분류에서Dev

내가 어떻게 JRuby에서의 컴파일 된 자바 클래스를로드 할 수 있습니까?

분류에서Dev

저장 프로 시저 내에서 매핑 된 NAS에 액세스 할 수 없습니다.

분류에서Dev

Tomcat 컨테이너에 대해 HTTP가 아닌 서블릿을 작성할 수 있습니까?

분류에서Dev

오류 : 다른 메서드에 정의 된 내부 클래스 내에서 최종이 아닌 변수 이름을 참조 할 수 없습니다.

분류에서Dev

mergeMap-> forkJoin으로 파이프 된 Observable에 매핑하고 RxJ의 다운 스트림에 객체를 전달할 수 있습니까?

분류에서Dev

그리드가 아닌 그래프에 A * 검색을 사용할 수 있습니까?

분류에서Dev

활동이 아닌 클래스에 활동을 전달할 수 있습니까?

분류에서Dev

절차 적 매크로에서 문자열이 키워드가 아닌 유효한 변수 이름인지 어떻게 확인할 수 있습니까?

분류에서Dev

Envers에서 공통된 매핑 된 기본 클래스를 사용하여 서로 다른 구체적인 파생 클래스에 대해 서로 다른 감사 모드를 가질 수 있습니까?

Related 관련 기사

  1. 1

    템플릿 클래스를 C ++에서 템플릿이 아닌 클래스로 "래핑"할 수 있습니까?

  2. 2

    sqlalchemy.exc.ArgumentError : 매퍼 매핑 된 클래스가 매핑 된 테이블 'users'에 대한 기본 키 열을 어셈블 할 수 없습니다.

  3. 3

    엔티티 프레임 워크, 클래스를 키 / 값 테이블에 매핑 할 수 있습니까?

  4. 4

    엔티티 프레임 워크, 클래스를 키 / 값 테이블에 매핑 할 수 있습니까?

  5. 5

    메서드가 아닌 클래스 수준에서 메서드를 호출 할 수 있습니까?

  6. 6

    그것은 글로벌 경로로 스프링 MVC에서 중첩 된 매핑을 매핑 할 수 있습니까?

  7. 7

    SqlAlchemy에서 매퍼를 사용하여 클래스와 뷰를 매핑 할 수 있습니까?

  8. 8

    Elasticsearch에서 인덱스 생성 및 데이터로드 후 매핑을 정의 할 수 있습니까?

  9. 9

    오류를 클래스 래핑 된 Bottle 메서드로 라우팅 할 수 있습니까?

  10. 10

    다른 메서드에 정의 된 내부 클래스 내에서 최종 변수가 아닌 lblNewLabel을 참조 할 수 없습니다.

  11. 11

    TypeScript에서 함수 오버로드에서 매핑 된 유형을 유추 할 수 있습니까?

  12. 12

    ConfigureService 메서드가 아닌 컨트롤러 또는 관리자 클래스에서 서비스를 추가 할 수 있습니까?

  13. 13

    ps는 Linux에서 커널이 아닌 프로세스 만 표시 할 수 있습니까?

  14. 14

    weak는 << errortype >>이 아닌 클래스 및 클래스 바인딩 된 프로토콜 유형에만 적용될 수 있습니다.

  15. 15

    루비 랙업 : 다른 매핑 내에서 프로그래밍 방식으로 매핑을 추가 할 수 있습니까?

  16. 16

    클래스에`@ objc` 접두사가없는 경우 Objective-C 프로젝트에서 Swift로 작성된 포드를 사용할 수 있습니까?

  17. 17

    PHPUnit에서 클래스의 일부가 아닌 함수를 어떻게 모의 할 수 있습니까?

  18. 18

    클래스 인스턴스가 아닌 이벤트에 변수를 어떻게 전달할 수 있습니까?

  19. 19

    그것은 기존의 엔티티 테이블에, 적은 분야로 새로운 POJO 클래스를 매핑 할 수 있습니까?

  20. 20

    Java-클래스가 중첩 된 클래스의 개인 필드에 액세스 할 수 있습니까?

  21. 21

    내가 어떻게 JRuby에서의 컴파일 된 자바 클래스를로드 할 수 있습니까?

  22. 22

    저장 프로 시저 내에서 매핑 된 NAS에 액세스 할 수 없습니다.

  23. 23

    Tomcat 컨테이너에 대해 HTTP가 아닌 서블릿을 작성할 수 있습니까?

  24. 24

    오류 : 다른 메서드에 정의 된 내부 클래스 내에서 최종이 아닌 변수 이름을 참조 할 수 없습니다.

  25. 25

    mergeMap-> forkJoin으로 파이프 된 Observable에 매핑하고 RxJ의 다운 스트림에 객체를 전달할 수 있습니까?

  26. 26

    그리드가 아닌 그래프에 A * 검색을 사용할 수 있습니까?

  27. 27

    활동이 아닌 클래스에 활동을 전달할 수 있습니까?

  28. 28

    절차 적 매크로에서 문자열이 키워드가 아닌 유효한 변수 이름인지 어떻게 확인할 수 있습니까?

  29. 29

    Envers에서 공통된 매핑 된 기본 클래스를 사용하여 서로 다른 구체적인 파생 클래스에 대해 서로 다른 감사 모드를 가질 수 있습니까?

뜨겁다태그

보관