我在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文件,其中包含应用程序的列表。我正在解析列表,以从每一行创建Application
和Organization
的实例。然后,我设置application.organization = organization
,然后执行session.add(application)
。
当我向数据库中添加应用程序时,如果是第一次添加的组织,则正确插入了它。但是,当发现一个应用程序与插入的应用程序具有相同的组织之前,它会抱怨一个错误-
sqlalchemy.exc.IntegrityError:(pymysql.err.IntegrityError)(1062, “键“名称”的重复条目“ MICROSOFT””)
我知道这是因为该组织已经存在于数据库中。
SQLAlchemy不会处理这种情况吗?如果没有,我该如何处理?
答案 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)