我在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来遍历它们。
答案 0 :(得分:0)
您在primaryjoin
中的Salary.wages
条件是错误的。假设Salary.id
是一个自动递增的主键列,并且由于您没有ForeignKey
的约束Salary.id
到Test_db_02.id
的值,因此您不太可能希望将该列包括在完成后的加入条件:
primaryjoin="Test_db_02.id == Salary.id"
由于该列具有Salary.test2_id
约束,因此您更可能希望通过ForeignKey
属性来关联两个模型:
primaryjoin="Test_db_02.id == Salary.test2_id"