Python SQLAlchemy具有多个外键实体的多对多表

Python SQLAlchemy具有多个外键实体的多对多表,python,sqlalchemy,Python,Sqlalchemy,我是sqlalchemy的新手,我希望做这件事尽可能简单,但要正确。我希望每月跟踪多家公司的域使用情况,因此我设置了以下表格: class Company(Base): __tablename__ = 'company' id = Column(Integer, primary_key = True) name = Column('name', String) class Domains(Base): __tablename__ = 'domains'

我是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')
类别公司(基本):
__tablename_uuu='公司'
id=列(整数,主键=True)
名称=列('name',字符串)
类域(基):
__tablename_uu='域'
id=列(整数,主键=True)
name=Column('name',String,unique=True)
班级月份(基数):
'''
跟踪所有用户的域使用情况
公司每月一次。
'''
__tablename_uuu='monthlyusage'
月=列(日期时间)
company_id=列(整数,ForeignKey('company.id'))
domain_id=列(整数,ForeignKey('domains.id'))
# 
公司=关系('company',backref='company\u assoc')
域=关系('Domains',backref='domain\u assoc')
这很好,直到我添加了第二个月的使用细节。然后我得到重复的键值错误:

*sqlalchemy.exc.IntegrityError:(IntegrityError)重复键值违反唯一约束“monthlyusage_pkey”*

这是否意味着我必须把“monthlyusage”分成第三张桌子?这似乎不必要地复杂,因为需要唯一的是月份、公司id和域id字段

对我的布局有什么建议吗,让它尽可能简单,但仍然正确


蒂亚

好的,我需要在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')
class MonthlyUsage(基本):
'''
跟踪所有用户的域使用情况
公司每月一次。
'''
__tablename_uuu='monthlyusage'
月=列(日期时间)
月份id=列(整数,主键=真)
company\u id=列(整数,ForeignKey('company.id'),primary\u key=True)
domain_id=列(整数,ForeignKey('domains.id'),primary_key=True)
# 
公司=关系('company',backref='company\u assoc')
域=关系('Domains',backref='domain\u assoc')

您能否显示正在运行的代码以实际添加用法?