繁体   English   中英

外键和关联表的SQLAlchemy问题

[英]SQLAlchemy problems with foreign keys and association tables

我正在尝试在个人,公司和该人在给定公司使用的电子邮件地址之间创建链接。

用SQL术语来说,我认为这将是四个表,Person,Company,Email和email_company_association,email_company_association中有两个FK,一个到电子邮件,一个到公司。 然后在“发给人”中添加一个FK。 电子邮件地址也可以直接连接到人,因此电子邮件中的人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")

我正在使用这个ca。 像这样:

p = Person()
c = Company(name="Foo LTD")
cea = Company_Email_Association()
cea.email = Email(email="foo@example.org") # 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, foo@example.org, null).
 'INSERT INTO emailaddresses (email, person_id) VALUES (%(email)s, %(person_id)s) RETURNING emailaddresses.id' {'person_id': None,'email': 'foo@example.org'}

我猜我在做SQLAlchemy和建模时都做错了,但是我不知所措。

似乎模型和数据库类是正确的,但是我对它们的用法不是。 使用以下代码似乎可以满足我的要求。

p = Person()
c = Company(name="Foo LTD")
cea = Company_Email_Association()
cea.email = Email(email="foo@example.org") # This breaks since Email needs persons.id
p.emailaddresses.append(cea.email)
c.email_addresses.append(cea)
p.companies.append(c)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM