2010-06-02 3 views
3

필자는 Pylons/PostgreSQL 응용 프로그램에 테스트 데이터 세트를로드하기 위해 조명기를 사용하여 실험 해 왔습니다. 자동 증가 ID 필드를 참조하는 경우 외래 키를 제대로 작성하지 못한다는 점을 제외하고는 위의 작업이 효과적입니다.외래 키와 SQLAlchemy로 조명기를 가져 오시겠습니까?

class AuthorsData(DataSet): 
    class frank_herbert: 
     first_name = "Frank" 
     last_name = "Herbert" 

class BooksData(DataSet): 
    class dune: 
     title = "Dune" 
     author_id = AuthorsData.frank_herbert.ref('id') 

그리고 모델 :

t_authors = sa.Table("authors", meta.metadata, 
    sa.Column("id", sa.types.Integer, primary_key=True), 
    sa.Column("first_name", sa.types.String(100)), 
    sa.Column("last_name", sa.types.String(100)), 
    ) 

t_books = sa.Table("books", meta.metadata, 
    sa.Column("id", sa.types.Integer, primary_key=True), 
    sa.Column("title", sa.types.String(100)), 
    sa.Column("author_id", sa.types.Integer, sa.ForeignKey('authors.id')) 
    ) 

는 "paster 설정 - 응용 프로그램 development.ini"을 실행, SQLAlchemey 그래서 "없음"으로 FK 값을보고

내 고정물은 다음과 같습니다 그것은 분명히 그것을 발견하지 못했습니다 :

15:24:27,284 INFO [sqlalchemy.engine.base.Engine.0x...9f50] 
CREATE TABLE authors (
    id SERIAL NOT NULL, 
    first_name VARCHAR(100), 
    last_name VARCHAR(100), 
    PRIMARY KEY (id) 
) 

15:24:27,284 INFO [sqlalchemy.engine.base.Engine.0x...9f50] {} 
15:24:27,291 INFO [sqlalchemy.engine.base.Engine.0x...9f50] COMMIT 
15:24:27,292 INFO [sqlalchemy.engine.base.Engine.0x...9f50] 
CREATE TABLE books (
    id SERIAL NOT NULL, 
    title VARCHAR(100), 
    author_id INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(author_id) REFERENCES authors (id) 
) 

15:24:27,293 INFO [sqlalchemy.engine.base.Engine.0x...9f50] {} 
15:24:27,300 INFO [sqlalchemy.engine.base.Engine.0x...9f50] COMMIT 
15:24:27,301 INFO [blog.websetup] Inserting initial data 
15:24:27,302 INFO [sqlalchemy.engine.base.Engine.0x...9f50] BEGIN 
15:24:27,309 INFO [sqlalchemy.engine.base.Engine.0x...9f50] INSERT INTO authors (first_name, last_name) VALUES (%(first_name)s, %(last_name)s) RETURNING authors.id 
15:24:27,309 INFO [sqlalchemy.engine.base.Engine.0x...9f50] {'first_name': 'Frank', 'last_name': 'Herbert'} 
15:24:27,320 INFO [sqlalchemy.engine.base.Engine.0x...9f50] INSERT INTO books (title, author_id) VALUES (%(title)s, %(author_id)s) RETURNING books.id 
15:24:27,320 INFO [sqlalchemy.engine.base.Engine.0x...9f50] {'author_id': None, 'title': 'Dune'} 
15:24:27,322 INFO [sqlalchemy.engine.base.Engine.0x...9f50] COMMIT 
15:24:27,323 INFO [blog.websetup] Done 

Fixture 문서는 실제로 이것이 문제 일 수 있다고 경고합니다. :

"그러나 일련 ID 열과 같이로드 될 때까지 값이없는 속성을 참조해야하는 경우가 있습니다.

http://farmdev.com/projects/fixture/using-dataset.html#referencing-foreign-dataset-classes는이 단지 SQLAlchemy의 지원되지 않습니다 것을 의미합니까 "(세션을 사용하는 경우. 이것은 SQLAlchemy의 데이터 계층에 의해 지원되지 않습니다)? 아니면 SA를 사용하지 않고 데이터를로드 할 수 있습니다 "세션"? 다른 사람들이이 문제를 어떻게 처리합니까?

답변

1

아직 삽입되지 않은 행을 참조하는 것은 의미가 없기 때문에 SQLAlchemy의 SQL 표현식 계층에서 지원되지 않습니다. 모든 쿼리가 명시 적으로 실행됩니다 .ORM 계층은 새 개체에 대한 참조를 지원하므로 it 작업 단위 패턴을 사용하여 올바르게 삽입 순서를 구성합니다.이 문제를 해결하기 위해 고정 장치는 ref() 메서드를 사용합니다. SQL 표현 레이어에서 (fixture) 명령문을 실행하므로 SQLAlchemy는 명령문을 재정렬 할 기회가 없다. 따라서 저자가 언급하기 전에 책을 저장하려고하면 author_id을 사용할 수 없습니다. 비품을 올바른 순서로 정리 (data() 방법으로 전달) 했습니까?

+0

위 내 업데이트 SA 로그를 참조 네 -. 필자는 심지어 저자와 서적 데이터를 완전히 분리 된 데이터() 문에 삽입하려고 시도했습니다 ... 행운을 빈다. –

1

author_id을 직접 지정하는 대신 author = AuthorsData.frank_herbert을 말하면 안됩니까?

AuthorsData를 삽입 한 후 meta.Session.flush()을 호출하면 id 속성이 값을 갖게됩니다. ID 할당이 필요할 때 테스트에서 사용하는 것입니다 (Fixture는 사용하지 않습니다).

0

나는 그런 orm.relation을 정의하여이 문제를 해결 :

class BooksData(DataSet): 
    class dune: 
     title = "Dune" 
     author = AuthorsData.frank_herbert 


mapper(Book, books, properties={ 
    'author': relation(Author) 
}) 
관련 문제