2014-07-13 2 views
0

내 모델은 SQLAlchemy의 create_all() 메소드를 사용하여 테이블을 PostgreSQL에서 올바르게 작동하지만 SQLite에서는 작동하지 않습니다. 다양한 열에 Enum을 사용합니다.SQLite의 Enums

이 문제는 Enum을 생성하는 것으로 보이지만, sqlite가 이들을 지원하지 않는다고 말할 수는 있지만 SQLAlchemy의 문서에 따르면 문제가 발생하지 않아야합니다. create_all() sqlite 메모리 db 시도 할 때 그냥 멈추는 경우에도 echo = True 출력 없음 나타납니다.

내가 문제를 보여주기 위해 다음 코드를 시도 :이 스크립트를 실행하면

from sqlalchemy import create_engine, Enum 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 
e = Enum('foo', 'bar', metadata=Base.metadata) 

engine = create_engine('sqlite:///:memory:', echo=True) 
Base.metadata.create_all(bind=engine) 

그것이 어떠한 출력을 보여줍니다를, 그냥 포장 마차. 파이썬은 100 % CPU를 사용하고 스크립트는 Ctrl-C가 끝날 때까지 끝나지 않습니다.

실제 스키마에서 create_all()을 시도 할 때 테이블이 있는지를 판별하려고하는 PRAGMA 명령을 반향하지만 Enums 작성시에 실속합니다. 나는 이것이 잘 작동 할 때까지 모델 정의에서 코드를 제거하려고 시도했다. 이것이 Enum이라고 생각했을 때였 다.

나는 이것을 SQLite 3.7.13을 사용하여 SQLAlchemy 0.9.6으로 Python 3.4에서 실행하려고 시도했다.

+1

나는 이것이 '열거 형'에 메타 데이터를 전달하는 버그라고 생각합니다. 실제 코드에서 kwarg를 제거하십시오. – Eevee

+0

당신이 옳은 것처럼 보였습니다, 나는 메타 데이터 kwargs를 제거했고 작동합니다. 만약 당신이 그것을 대답에 넣으면 나는 그것을 투표 할 수 있습니다. – Blubber

+0

라이브러리가 꽉 닫히면 버그입니다. [버그 추적기] (https://bitbucket.org/zzzeek/sqlalchemy)로 바로 가십시오. – zzzeek

답변

1

친구가이 똑같은 문제를 최근에 만났습니다. SQLA에서 무한 루프 버그가 생겼습니다. (필자는 정말보고해야합니다.

실제 코드에서 metadata= kwarg를 삭제하면됩니다. 열거 형이 선언 클래스 내부에서 유형으로 사용되는 한, 올바른 메타 데이터를 상속합니다.