2015-02-09 84 views
0

我试图创建一个人,一个公司和一个人在给定公司使用的电子邮件地址之间的链接。SQLAlchemy关于外键和关联表的问题

在SQL术语中,我认为这将是四个表,Person,Company,Email和email_company_association,其中两个FK在email_company_association中,一个在电子邮件中,一个在公司。然后将电子邮件中的一个FK发送给Person。电子邮件地址也可以直接连接到个人,因此电子邮件中的个人FK也是如此。

但是我有点茫然如何在SQLAlchemy中做到这一点。

我已经试过类似:

class Person(Base): 
    """ 
    A person 
    """ 
    __tablename__ = 'persons' 

    id = Column(Integer, Sequence('person_id_seq'), primary_key=True) 
    name = Column(String(255), unique=True) 
    surename = Column(String(255)) 
    forename = Column(String(255)) 

class Company(Base): 
    """ 
    A company 
    """ 
    __tablename__ = 'companies' 

    id = Column(Integer, Sequence('company_id_seq'), primary_key=True) 
    name = Column(String) 
    email_addresses = relationship("Company_Email_Association", backref="company") 
    person_id = Column(Integer, ForeignKey('persons.id'), nullable=False) 
    person = relationship("Person", backref=backref('companies', order_by=id)) 

class Email(Base): 
    """ 
    Email address 
    """ 
    __tablename__ = 'emailaddresses' 
    id = Column(Integer, primary_key=True) 
    email = Column(String, nullable=False) 
    person_id = Column(Integer, ForeignKey('persons.id'), nullable=False) 
    person = relationship("Person", backref=backref('emailaddresses', order_by=id)) 

class Company_Email_Association(Base): 
    __tablename__ = 'company_email_assoc' 
    company_id = Column(Integer, ForeignKey('companies.id'), primary_key=True) 
    email_id = Column(Integer, ForeignKey('emailaddresses.id'), primary_key=True) 
    email = relationship("Email") 

我使用此约像这样:

p = Person() 
c = Company(name="Foo LTD") 
cea = Company_Email_Association() 
cea.email = Email(email="[email protected]") # This breaks since Email needs persons.id 
c.email_addresses.append(cea) 
p.companies.append(c) 

这是我的错误:

sqlalchemy.exc.IntegrityError: (IntegrityError) null value in column "person_id" violates not-null constraint 
DETAIL: Failing row contains (1, [email protected], null). 
'INSERT INTO emailaddresses (email, person_id) VALUES (%(email)s, %(person_id)s) RETURNING emailaddresses.id' {'person_id': None,'email': '[email protected]'} 

我猜我做两个SQLAlchemy的和造型非常错误的,但我在在做什么损失。

回答

1

看起来像模型和数据库类是正确的,但我的用法是没有的。使用下面的代码似乎做我想要的。

p = Person() 
c = Company(name="Foo LTD") 
cea = Company_Email_Association() 
cea.email = Email(email="[email protected]") # This breaks since Email needs persons.id 
p.emailaddresses.append(cea.email) 
c.email_addresses.append(cea) 
p.companies.append(c) 

将电子邮件地址添加到Person对象至关重要。