3

フィクスチャを使用してテスト データ セットを Pylons / PostgreSQL アプリにロードする実験を行っています。これは、自動インクリメント ID フィールドを参照する場合に外部キーを適切に作成できないことを除けば、うまく機能します。

私の備品は次のようになります。

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 setup-app development.ini」を実行すると、SQLAlchemey は FK 値を「None」と報告するため、明らかに見つからない:

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

フィクスチャのドキュメントでは、これが問題になる可能性があると実際に警告しています。

「ただし、場合によっては、シリアル ID 列のように、ロードされるまで値を持たない属性を参照する必要がある場合があります。(セッションを使用する場合、これは SQLAlchemy データ層ではサポートされないことに注意してください。)」

http://farmdev.com/projects/fixture/using-dataset.html#referencing-foreign-dataset-classes

これは、これが SQLAlchemy でサポートされていないということですか? または、SA「セッション」を使用せずにデータをロードすることは可能ですか? 他の人々はこの問題をどのように扱っていますか?

4

3 に答える 3

1

直接author = AuthorsData.frank_herbert指定する代わりに言うことはできませんか?author_id

それ以外に、おそらくmeta.Session.flush()AuthorsData を挿入した後に呼び出すと、id 属性が強制的に値を取得するのでしょうか? これは、ID を割り当てる必要があるときにテストで使用するものです (フィクスチャは使用しません)。

于 2010-07-07T21:35:57.970 に答える
1

まだ挿入されていない行の参照は、意味がないため、SQLAlchemy の SQL 式レイヤーではサポートされていません。すべてのクエリが明示的に実行されます。ORM レイヤーは新しいオブジェクトへの参照をサポートしており、作業単位パターンを使用して挿入順序を適切に整理しています。この問題を解決するために、フィクスチャはref()メソッドを使用します。ただし、SQL 式レイヤーでは (fixture) ステートメントを実行するため、SQLAlchemy はそれらを並べ替える機会がないことに注意してください。そのため、author_id本が参照する著者の前に本を保存しようとすると、 は使用できません。data()フィクスチャが適切な順序で編成されている (メソッドに渡されている) ことは確かですか?

于 2010-06-03T09:36:47.173 に答える
0

orm.relation次のように定義することで、この問題を解決します。

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


mapper(Book, books, properties={
   'author': relation(Author)
 })
于 2011-07-21T08:11:22.280 に答える