2009-07-22 5 views
1

내가 좋아하는 SQLAlchemy의에서 모델을 정의 얻을 수 있습니다 얼마나 가까이 :SQLAlchemy의 - 모델 - 동적 필드를 사용하여 - 액티브

class Person(Base): 
    pass 

그리고 그냥 동적으로 필드 이름을 선택했다? 어쨌든 테이블 간의 관계를 제어하는 ​​명명 규칙을 얻으려면? 나는 RoR의 ActiveRecord와 비슷한 것을 찾고 있지만 파이썬에서는 찾고있다.

잘 모르겠지만이 문제는 cPython보다는 IronPython에서 사용하려고합니다.

답변

4

자동으로 필드 이름을 선택하는 것은 매우 간단하다 :

from sqlalchemy import Table 
from sqlalchemy.orm import MetaData, mapper 

metadata = MetaData() 
metadata.bind = engine 

person_table = Table(metadata, "tablename", autoload=True) 

class Person(object): 
    pass 

mapper(Person, person_table) 

이 방법을 사용하여, 당신은 mapper()에 호출 관계를 정의 할 필요가 없기 때문에 관계에는 자동 검색.

가 자동으로 같은 이름의 테이블에 클래스를 매핑하려면, 당신은 할 수 :

def map_class(class_): 
    table = Table(metadata, class_.__name__, autoload=True) 
    mapper(class_, table) 

map_class(Person) 
map_class(Order) 

비약 당신이 원하는 모든 것을 할 수 있습니다.

+0

+1. 명명 규칙을 기반으로하는 자동 관계는 어떻게 지원됩니까? 예제와의 좋은 링크? thanks codeape – BuddyJoe

+0

나는 이것이 관계를 위해 일한다고 생각하지 않는다. 이들은 매퍼에서 수동으로 정의되어야합니다. – sebasgo

+0

autoload = True는 데이터베이스 스키마에서 데이터베이스 메타 데이터를 작성하고 간단한 데이터 필드에 대한 맵핑이 자동으로 작성되지만 관계를 수동으로 정의해야합니다. 일 부 또는 일대일 행을 추측 할 수 없기 때. 데이터베이스 레이아웃에서 1 대 1로. – sebasgo

2

AFAIK sqlalchemy는 의도적으로 데이터베이스 메타 데이터와 클래스 레이아웃을 분리합니다.

Elixir (http://elixir.ematia.de/trac/wiki)를 조사해야 할 수도 있습니다. sqlalchemy의 활성 레코드 패턴이지만 데이터베이스 테이블이 아닌 클래스를 정의해야합니다.