SQLAlchemy:无法找到任何有关主联接条件的外键列

时间:2019-08-11 15:51:18

标签: python sqlalchemy

我在postgres CLI中建立了两个表(test2_table:ID,名称,年龄,职业,城市,国家)。第二个引用了我的第一张表的ID,并且有一列称为工资。当我运行语法时,一切都很好。

SELECT name, age, profession, city, country, wage FROM test2_table JOIN salary ON salary.test2_id = test2_table.id; 

这有效-印有工资表供我查看。

我唯一的问题是,当我对SQLAlchemy数据库类尝试相同的操作时。当我尝试将各个类一起加入时,出现错误:

sqlalchemy.exc.ArgumentError: Could not locate any relevant foreign key columns for primary join condition 'test2_table.id = salary.id' on relationship Salary.wages.
Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or are annotated in the join condition with the foreign() annotation.

我的数据库类:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Test_db_02(Base):
    __tablename__ = 'test2_table'
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(40))
    age = Column('age', Integer)
    profession = Column('profession', String(60))
    city = Column('city', String(60))
    country = Column('country', String(40))

class Salary(Base):
    __tablename__ = 'salary'
    id = Column('id', Integer, primary_key=True)
    wage = Column('wage', String(20))
    test2_id = Column('test2_id', Integer, ForeignKey('test2_table.id'))

    wages = relationship("Test_db_02", backref="salary", primaryjoin="Test_db_02.id == Salary.id")

我有一个简单的报告页面,提示用户从下拉选项选择器中进行选择。在尝试将两个表一起加入之前,我的查询运行良好,现在尝试加入后出现错误。在此示例中,@ app报告已按比例缩小。

报告@ app.route

Session = sessionmaker(bind=engine)
session = Session()

@app.route('/reports', methods=['GET', 'POST'])
if request.method == 'GET':
    return render_template('reports.html')
else:
    if request.form.get("report_options") == "all_db":
        db_entry = session.query(Test_db_02).order_by(Test_db_02.id)
        db_entry = db_entry.all()
        return render_template('reports.html', db_entry=db_entry)
    elif request.form.get("report_options") == "name":
        db_entry = session.query(Test_db_02).order_by(Test_db_02.id)
        data_name = db_entry.all()
        return render_template('reports.html', data_name=data_name)
    elif request.form.get("report_options") == "media_prof":
        db_entry = session.query(Test_db_02).join(test2_table.salary)
        media_prof = db_entry.all()
        return render_template('reports.html', media_prof=media_prof)

老实说,我已经阅读了有关关系,联接和外键的sqlalchemy文档(并看了一些YouTube教程),但看起来还是有些困惑。

对我来说,主要挑战是如何将两个表连接在一起。完成此操作后,我将尝试通过设置烧瓶/ jinja来遍历它们。

1 个答案:

答案 0 :(得分:0)

您在primaryjoin中的Salary.wages条件是错误的。假设Salary.id是一个自动递增的主键列,并且由于您没有ForeignKey的约束Salary.idTest_db_02.id的值,因此您不太可能希望将该列包括在完成后的加入条件:

primaryjoin="Test_db_02.id == Salary.id"

由于该列具有Salary.test2_id约束,因此您更可能希望通过ForeignKey属性来关联两个模型:

primaryjoin="Test_db_02.id == Salary.test2_id"