2012-03-04 2 views
0

SQLAlchamy에 대한 설명서와 튜토리얼을 이해하는 데 어려움을 겪고 있습니다.SQLAlchamy 데이터베이스 구축 및 재사용

DB 테이블에서 클래스를 자동로드하는 방법을 배우고, 클래스를 디자인하고이를 (선언적으로 또는 매퍼()를 사용하여) DB에 추가 된 테이블로 만드는 방법을 본다.

내 질문은 입니다 (예 : 첫 번째 실행시) 테이블을 생성하고 다시 사용하는 코드를 작성하는 방법은입니까?

하나의 도구 또는 하나의 코드 조각으로 데이터베이스를 만들고 데이터베이스를 사용할 별도의 코드를 갖고 싶지 않습니다. 사전에

감사합니다, 피터

답변

1

create_all() 테이블이 이미있는 경우 아무 것도하지 않으므로 엔진 또는 연결을 설정하는 즉시 호출하십시오.

(주 당신이 당신의 테이블 스키마를 변경 경우 그, create_all() 것이다 하지 갱신 그것은 그래서 당신은 여전히 ​​"다른 프로그램"그렇게 할 필요!).

이것은 일반적인 패턴입니다 :

def createEngine(metadata, dsn, **args): 
    engine = create_engine(dsn, **args) 
    metadata.create_all(engine) 
    return engine 

def doStuff(engine): 
    res = engine.execute('select * from mytable') 
    # etc etc 

def main(): 
    engine = createEngine(metadata, 'sqlite:///:memory:') 
    doStuff(engine) 

if __name__=='__main__': 
    main() 
+0

고마워요. 제가 존재하지 않는 문제에 대한 해결책을 찾고 있다고 생각합니다. 클래스를 명시 적으로 자동로드하거나 정의하는 모범 사례 솔루션은 무엇입니까? 전자는 DB와 객체가 일치하는 것으로 보이지만, 후자는 '마법에 의해'대신 코드에서 객체를 지정합니다. – user1247965

+1

응용 프로그램에서 데이터베이스를 "소유"한 경우 (즉, 응용 프로그램 용으로 작성된 경우) 코드에서 테이블 구조를 명시 적으로 지정하십시오. 응용 프로그램이 단순히 기존 데이터베이스를 사용하는 경우 자동로드가 필요합니다. 두 경우 모두 여전히 테이블 구조가 응용 프로그램의 기대치와 일치한다는 보장은 없습니다. 스키마가 예상 한 것과 충분히 다를 경우 앱이 두 시나리오 중 하나에서 중단 될 수 있습니다. –

0

나는 당신이 아마-를 통해 생각하는 상황을 것 같아요. 데이터베이스를 새로 작성하려면 일반적으로 Base.metadata.create_all() 또는 이와 동등한 번호로 전화하십시오. 그러지 않으려면 호출하지 마십시오.

데이터베이스가 이미 설정되었다고 가정 할 때마다 매번 호출하고 잘못된 경우 예외 처리를 시도 할 수 있습니다.

또는 특정 테이블에 대해 쿼리를 시도해 볼 수 있습니다. 실패한 경우 create_all()으로 전화하여 모든 것을 입력하십시오.

db 생성 여부와 관계없이 앱의 다른 모든 부분이 동일한 방식으로 작동해야합니다.

+0

감사합니다. 그 말은 ... 처음부터 고칠 문제는 없습니다! – user1247965

관련 문제