1

私は sqlalchemy を初めて使用しますが、これをできるだけ簡単に、しかも正しく行いたいと考えています。複数の企業でのドメインの使用状況を月単位で追跡したいので、次の表を設定します。

class Company(Base):
    __tablename__ = 'company'

    id = Column(Integer, primary_key = True)
    name = Column('name', String)


class Domains(Base):
    __tablename__ = 'domains'

    id = Column(Integer, primary_key=True)
    name = Column('name', String, unique=True)

class MonthlyUsage(Base):
    '''
    Track domain usage across all
    companies on a monthly basis.
    '''
    __tablename__ = 'monthlyusage'

    month = Column(DateTime)
    company_id = Column(Integer, ForeignKey('company.id'))
    domain_id  = Column(Integer, ForeignKey('domains.id'))

    # <...other columns snipped out...>

    company = relationship('Company', backref='company_assoc')
    domain = relationship('Domains', backref='domain_assoc')

2 か月目の使用状況の詳細を追加するまで、これは問題なく機能します。次に、キー値の重複エラーが発生します。

*sqlalchemy.exc.IntegrityError: (IntegrityError) 重複するキー値が一意の制約 "monthlyusage_pkey" に違反しています*

これは、「月間使用量」を 3 番目のテーブルに分割する必要があるということですか? 一意である必要があるのは month、company_id、および domain_id フィールドだけであるため、これは不必要に複雑に思えます。

ここでのレイアウトについて、可能な限りシンプルに保ちながら正しいものにするための提案はありますか?

ティア!

4

1 に答える 1

0

さて、MonthlyUsage に主キー列を追加する必要がありました。以下のコードが動作するようになりました...

class MonthlyUsage(Base):
    '''
    Track domain usage across all
    companies on a monthly basis.
    '''
    __tablename__ = 'monthlyusage'

    month = Column(DateTime)
    month_id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('company.id'), primary_key=True)
    domain_id  = Column(Integer, ForeignKey('domains.id'), primary_key=True)

    # <...other columns snipped out...>

    company = relationship('Company', backref='company_assoc')
    domain = relationship('Domains', backref='domain_assoc')
于 2013-11-01T14:05:07.837 に答える