SQLAlchemy中的一对多关系

时间:2019-07-29 05:13:06

标签: sqlalchemy flask-sqlalchemy

我在SQLAlchemy中具有以下一对多关系。

class Application(Base):
    __tablename__  = "application"

    id = Column("id", Integer, primary_key = True, autoincrement = True)        
    organization_id = Column(Integer, ForeignKey('organization.id'))
    organization = relationship("Organization", uselist=False, back_populates="applications")

class Organization(Base):
    __tablename__  = "organization"

    id = Column("id", Integer, primary_key = True, autoincrement = True)
    name = Column("name", String(128), unique = True, nullable = False)
    applications = relationship("Application", back_populates="organization")

简而言之,“一个组织可以有多个应用程序,而一个应用程序可以只有一个组织”。

我推断的方式是Organization类是父级,而Application类是子级。

我有一个.csv文件,其中包含应用程序的列表。我正在解析列表,以从每一行创建ApplicationOrganization的实例。然后,我设置application.organization = organization,然后执行session.add(application)

当我向数据库中添加应用程序时,如果是第一次添加的组织,则正确插入了它。但是,当发现一个应用程序与插入的应用程序具有相同的组织之前,它会抱怨一个错误-

  

sqlalchemy.exc.IntegrityError:(pymysql.err.IntegrityError)(1062,   “键“名称”的重复条目“ MICROSOFT””)

我知道这是因为该组织已经存在于数据库中。

SQLAlchemy不会处理这种情况吗?如果没有,我该如何处理?

1 个答案:

答案 0 :(得分:0)

您可能每次都在创建一个新的组织,而不是抓住一个已经存在的组织(如果存在)。

此代码应为您指明正确的方向

# Organization name from your CSV
org_name = 'MICROSOFT'

# Get Organization if it already exists
application.organization = Organization.query.filter(Organization.name == org_name ).first()

# If the Organization doesn't exist, create a new one
if application.organization is None:
    application.organization = Organization(name=org_name)
相关问题