SQLAlchemy:如果某些记录和关系数据尚不存在,则插入记录

SQLAlchemy: insert record if certain record and relationship data does not already exist

我想知道如何使用多个条件从多个 table 中查询数据。

我的示例数据库具有以下 tables:

class Location(Base):
    __tablename__ = "location"

    id = Column('id', Integer, primary_key=True)
    location = Column('Location', String)

class Person(Base):
    __tablename__ = "person"

    id = Column('id', Integer, primary_key=True)
    name = Column('Name', String, unique=True)
    profession = Column('Profession', String)
    location_id = Column(Integer, ForeignKey('location.id'))
    location = relationship(Location)

我们在此数据库中有一个具有特定位置的人。我的目标是编写一个查询,我可以在其中检查 Location table 和 Person table.

的条件

一个名叫埃里克的人住在休斯顿。现在我想知道我的数据库中是否已经有来自休斯顿的 Eric。

以下查询无效。

new_location = Location(location='Houston')
obj = Person(name='Eric', profession='Teacher', location=new_location)

if session.query(Person).filter(Person.name == obj.name,
Person.profession == obj.profession,
Person.location_id == obj.location.id).first() == None:
session.add(obj)
session.commit()
print("Insert sucessful")

我查询中的问题是我检查位置的最后一行,但我不知道如何解决它。也许有人有一个使用 SQLAlchemy 方法的工作示例 exists()?

您可以执行类似以下操作来加入 PersonLocation 并过滤名称和位置与您创建的新人员实例相同的任何记录。查询将 return 记录或 None,因此您可以在 if 中使用结果(请记住缩进很重要 - 也许您问题中的代码示例只是复制不正确)。

new_location = Location(location='Houston')
new_person = Person(name='Eric', profession='Teacher', location=new_location)

person_location_exists = session.query(Person).\
    join(Location).\
    filter(Person.name == new_person.name).\
    filter(Location.location == new_location.location).\
    first()

if not person_location_exists:
    session.add(new_person)
    session.commit()
    print("Insert successful")

你可以用exists()来完成同样的事情,但我认为上面的更简单一些。