SQLAlchemy中的Backref返回空列表

时间:2020-05-16 23:49:16

标签: python sqlalchemy

我正在关注SQLAlchemy的文档,但无法获得所需的结果。有人可以告诉我代码有什么问题吗

Models.py

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()
class Employer(Base):
    __tablename__ = 'employer_table'

    id = Column(Integer, primary_key=True)
    employer_name = Column(String)
    employee = relationship("Employee", backref="employer_table")

    def __repr__(self):
        return f'Employer : {self.employer_name}'

class Employee(Base):
    __tablename__ = 'employee_table'

    id = Column(Integer, primary_key=True)
    employer_id = Column(Integer, ForeignKey('employer_table.id'))
    employee_name = Column(String)

    def __repr__(self):
        return f'Employee : {self.employee_name}'

App.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Person, Employer, Employee

# Create the engine
engine = create_engine('sqlite:///:memory:', echo=False)
Session = sessionmaker(bind=engine)
session = Session()

# Create All Tables
Employer.metadata.create_all(engine)
Employee.metadata.create_all(engine)

employer = Employer(employer_name="ABC Corp")
employee = Employee(employee_name="John")
session.add(employer)
session.add(employee)
session.commit()

print(employer.employee)

我刚得到空名单。最初,我在没有backref的情况下尝试了一下,以了解relationships,但它似乎也不适用于backref

1 个答案:

答案 0 :(得分:0)

在给定的代码中,绑定到phn1='4123-111-1234' 的{​​{1}}实例是在未向Employer添加任何employer实例(例如通过Employee)的情况下创建的,也没有是append创建的,但没有引用employer.employee。解决此问题的一种快速方法是,只需在创建两个实例后添加以下行:

employee

现在运行以下命令:

employer

提供此输出:

employer.employee.append(employee)

或者,如果首先添加了雇主:

employer = Employer(employer_name="ABC Corp")
employee = Employee(employee_name="John")
employer.employee.append(employee)
session.add(employer)
session.add(employee)
session.commit()

print(employer.employee)

后来,创建了一个雇员,然后可以查询特定名称的雇主,然后还可以将雇主的ID分配给该雇员,那么仍然可以达到相同的预期效果:

[Employee : John]

输出

employer = Employer(employer_name="DEF Corp")
session.add(employer)
session.commit()