2009-05-07 4 views
0

私は現在のプロジェクトの中で、複雑なデータ構造をメモリに格納するためのいくつかのクラスを作成しました。データベース。 SQLAlchemyをORMレイヤーとして使用することを決めました。これは、自分のニーズに合わせて調整できる最も柔軟なソリューションです。オブジェクトの属性にデータベーステーブルをマッピングする

私の問題は、テーブル全体をメモリ内の配列属性にマップする必要があり、SQLAlchemyでこれが可能かどうかを調べるのが難しいことです。私がまだコード内のデータ構造を変更することは可能ですが(理想的ではありませんが)、そうでない場合はそうしたいと思います。

問題のテーブルは、次のSQLを使用して作成されます。

CREATE TABLE `works` (
`id` BIGINT NOT NULL auto_increment, 
`uniform_title` VARCHAR(255) NOT NULL, 
`created_date` DATE NOT NULL, 
`context` TEXT, 
`distinguishing_characteristics` TEXT, 
PRIMARY KEY (`id`), 
INDEX (`uniform_title` ASC), 
INDEX (`uniform_title` DESC) 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ; 

CREATE TABLE `variant_work_titles` (
`id` BIGINT NOT NULL auto_increment, 
`work_id` BIGINT NOT NULL, 
`title` VARCHAR(255) NOT NULL, 
PRIMARY KEY(`id`), 
INDEX (`work_id`), 
INDEX (`title` ASC), 
INDEX (`title` DESC), 
FOREIGN KEY (`work_id`) 
    REFERENCES `works` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

は、これは完全なデータベースのほんの一部であり、同じことは、いくつかの場所で必要とされようとしています。

答えて

1

あなたの質問に明確にしてくださいいない場合は、

work_instance.variants = [<some iterable of variants>] 

ような何かをしたいようです。

理想的には、これらの2つのテーブルに2つのマッピングが必要です。それ以外の場所で2番目のマッピングにアクセスしないかどうかは関係ありません。 workマッピングは、variantマッピングに対して1対多の関係を持つ必要があります。これにより、あなたの関係を定義する属性のいずれかに特定のworkに関連付けられたvariantインスタンスのリストが表示されます。

+0

これは、私が望むものとほとんど同じように聞こえる。バリアントのためのPythonクラスを特別に用意することなく、これを行う方法はありますか?あるいは、シンプルであるにもかかわらず、これらの要素のそれぞれにクラスを持たなければなりませんか? – workmad3

+0

SQLAlchemy ORMのクラスは必要ありません。 ORMマッピングなしでテーブルを照会するだけで済みます。明示的なfetchall()を使用すると、すべての行を取得できます。あなたは辞書のリストを取得します。 –

+0

S.Lottが正しいです、あなたは各テーブルのためのクラスを持つ必要はありません。しかし、私はとにかくそれらを作成します。あなたのコードのどこかで、バリアントを操作したいと思うかもしれませんし、マッピングを行うことが、作業マッピングに機能を付加するよりも実際的であるかもしれません。 – muhuk

関連する問題