2011-07-02 7 views
1

テーブルauthorsbooksは多対多の関係にあります。本は多くの作家を持つことができます。著者はおそらく多くの本を書いています。多対多の関係(sqlalchemy、python)を仮定し、重複を追加しないようにするには?

author_1 = Author('Dan') 
session.add(author_1) 
author_1.books = [Paper('Illuminati'), Book('Sacrileg')] 
session.commit() 

これは、2冊の本と著者をデータベースに追加してリンクします。これまでのところすべてが問題ありません。異なる表の両方の列(authors.namebooks.title)は一意です。

新しい投稿者を追加しましょう。Danには、Illuminatiと書かれているとしましょう。

author_2 = Author('Brownie') 
session.add(author_2) 
author_2.books = [Paper('Illuminati')] 
session.commit() 

この結果、重複エラーが発生します。何故ですか?最初にPaper('Illuminati')をクエリする必要がありますか?もし私が本のリスト全体を持っていたら?私はそれらのすべての1つを照会する必要がありますか?または、自動関数があります。エントリが既に存在し、それにリンクしているかどうかをsqlalchemyがどのように判断できるのでしょうか?

+1

'ペーパー(「イルミナティは」)は'新しいオブジェクトたびに、(「1」) 'の同じオブジェクトではありません' =紙に気づくを作成します'b = Paper( '1')'と同じように、あなたの論文はDB内の同じオブジェクトではありません。試してみてください 'paper = Paper( 'Illuminati'); author_1.books = [ペーパー]; author_2.books = [論文]; 'または、author_2で設定する前に最初の用紙(DB内)を選択してください。あなたの素敵な答えに感謝します。 – renatopp

答えて

2

これは基本的に@renatoppコメントのロングバージョンです

これは、重複エラーになります!何故ですか?

dbに似た新しい本/論文を作成します。私はそれを取るあなたは紙/本の一意の制約を持つnameを設定します

まず用紙( 'イルミナティ')をクエリする必要がありますか?

のは、あなたが

前のは、新しい著者を追加してみましょう、とのダンは、イルミナティを書いていくつかの助けを持っていたと仮定しましょう言ったか見てみましょう。

この新しい著者は、DanライトIlluminatiに役立ちます。同じイルミナティは既にデータベースにあります。そこにあなたのコードは、「ブラウンはダンのような名前の新しい本を書く」という意味です。だから2冊の本があるので、重複エラーです。

「ブラウンイを助けるダン」が必要な場合は、彼にと同じと書かなければなりません。ダンのイルミナティをデータベースから手に入れて、ブラウニーにダンを助けるよう伝えます。

# illuminati = Dan's book from db 
    author_2.books.append(illuminati) 

ここにコードが変更されています。間違ったImは、私はあなたがすべての彼の本を取り外し、その後彼に本を与えない、ブラウニーに本を追加する意味だと思うなら、私を修正(author_2.books = [Paper('Illuminati')]

私は本の全体のリストを持っているでしょうか?私はそれらのすべての1つを照会する必要がありますか?

彼らはすべて新しい本ですか?または既存の書籍?たぶんそれらのいくつかだけ新しい?または、あなたはまったく知りませんか?

あなたがそれらを確認するか、試してみてよcatching the exception

+0

私はさらなる質問があります。あなたは本をたくさん追加したいと思っていますが、重複したエラーを避けるために、どちらがすでにデータベースに入っているかを調べるエレガントな方法はありますか? – Aufwind

関連する問題