簡體   English   中英

SQLAlchemy 中的反向引用返回空列表

[英]Backref in SQLAlchemy returns empty list

我正在關注 SQLAlchemy 的文檔,但我無法獲得所需的結果。 有人可以指出我的代碼有什么問題嗎

模型.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}'

應用程序.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

在給出的代碼中,綁定到employerEmployer實例是在沒有添加任何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)

產生這個 output:

[Employee : John]

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

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

之后再創建一個employee,然后可以查詢特定名字的employee,然后也可以將employee的id分配給employee,那么還是可以達到同樣的效果:

employer = session.query(Employer).filter(
    Employer.employer_name=='DEF Corp').first()
employee = Employee(employee_name="Mary")
employee.employer_id = employer.id
session.add(employee)
session.commit()

print(employer.employee)

Output

[Employee : Mary]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM