Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLAlchemy';中执行联接时出错;请指定';onclause';明确地表示这种连接;_Python_Sqlalchemy_Flask Sqlalchemy_Flask Restless - Fatal编程技术网

Python 在SQLAlchemy';中执行联接时出错;请指定';onclause';明确地表示这种连接;

Python 在SQLAlchemy';中执行联接时出错;请指定';onclause';明确地表示这种连接;,python,sqlalchemy,flask-sqlalchemy,flask-restless,Python,Sqlalchemy,Flask Sqlalchemy,Flask Restless,我有以下使用flask sqlalchemy的sqlalchemy模型。我的日程模型中有3个talentpref项目。总需要3个或更多 class TalentPref(db.Model): __tablename__ = 'talentpref' id = db.Column(db.Integer, primary_key=True) firstName = db.Column(db.String(80), unique=True) lastName = db.

我有以下使用flask sqlalchemy的sqlalchemy模型。我的日程模型中有3个talentpref项目。总需要3个或更多

class TalentPref(db.Model):
    __tablename__ = 'talentpref'
    id = db.Column(db.Integer, primary_key=True)
    firstName = db.Column(db.String(80), unique=True)
    lastName = db.Column(db.String(80), unique=True)

    def __init__(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

    def __repr__(self):
        return '<talentpref %r %r>' % (self.firstName, self.lastName)

class Schedule(db.Model):
    __tablename__ = 'schedule'

    id = db.Column(db.Integer, primary_key=True)

    talentpref1_id = db.Column(db.Integer, db.ForeignKey('talentpref.id'))
    talentpref2_id = db.Column(db.Integer, db.ForeignKey('talentpref.id'))
    talentpref3_id = db.Column(db.Integer, db.ForeignKey('talentpref.id'))

    talentpref1 = db.relationship("TalentPref", uselist=False, foreign_keys=talentpref1_id)
    talentpref2 = db.relationship("TalentPref", uselist=False, foreign_keys=talentpref2_id)
    talentpref3 = db.relationship("TalentPref", uselist=False, foreign_keys=talentpref3_id)
但使用以下http GET查询字符串的查询失败:

/api/schedule?id=id&page=1&q={"order_by":[{"field":"talentpref1__lastName","direction":"desc"}]}
与:

回溯(最近一次呼叫最后一次):
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/flask\u untivent/views.py”,第1172行,搜索中
结果=搜索(self.session、self.model、search_参数)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/flask_untivent/search.py”,搜索中第587行
查询=创建查询(会话、模型、搜索参数、忽略顺序)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/flask\u untivent/search.py”,第549行,在create\u查询中
_忽略(订购人)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/flask\u untivent/search.py”,第498行,在create\u查询中
query=query.join(关系模型)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第1971行,在join中
from_joinpoint=from_joinpoint)
文件“”,第2行,在连接中
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/sqlalchemy/orm/base.py”,第201行,在generate中
fn(自,*参数[1:],**千瓦)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第2115行,在
外部连接、完整、创建_别名、道具)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第2188行,从左到右连接
自我连接到左(左、右、左、右、左、外连接、全)
文件“/Users/myuser/Documents/pythonenvironments/venv/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第2317行,从左到右
尝试加入%s,但得到:%s“%(对,ae))
InvalidRequestError:找不到要从中加入的FROM子句。尝试
加入,但得到:无法确定
“时间表”和“人才储备”之间的连接;表具有多个属性
它们之间的外键约束关系。请详细说明
此联接的“onclause”是显式的。

有什么方法可以成功查询此关系吗?

这似乎是其自身的局限性。当通过一个表单时,它将。它使用“关系”属性查找要加入的相关模型类:

if '__' in field_name:
    field_name, field_name_in_relation = \
        field_name.split('__')
    relation = getattr(model, field_name)
    relation_model = relation.mapper.class_
    field = getattr(relation_model, field_name_in_relation)
    direction = getattr(field, val.direction)
    query = query.join(relation_model)
    #                  ^^^^^^^^^^^^^^ TalentPref model class
    query = query.order_by(direction())

在你的情况下,这是有效的

query = query.join(TalentPref)
既然你有,SQLAlchemy无法决定该做什么。如果您使用而不是加入目标实体,或者将
relationship()
-driven-ON子句调整为目标实体,则这不会是一个问题

您可以修补您的flask Untivent以修复此特定查询:

--- search.py   2017-03-29 09:56:00.439981932 +0300
+++ search_joinfix.py   2017-03-29 09:56:41.375851375 +0300
@@ -495,7 +495,7 @@
                         relation_model = relation.mapper.class_
                         field = getattr(relation_model, field_name_in_relation)
                         direction = getattr(field, val.direction)
-                        query = query.join(relation_model)
+                        query = query.join(relation)
                         query = query.order_by(direction())
                     else:
                         field = getattr(model, val.field)

用http GET query STRING更新了帖子我不是用Python查询的。我正在使用flask Untivent,它允许您定义一个作为rest资源提供的模型。您可以使用http参数筛选器查询资源:
query = query.join(TalentPref)
--- search.py   2017-03-29 09:56:00.439981932 +0300
+++ search_joinfix.py   2017-03-29 09:56:41.375851375 +0300
@@ -495,7 +495,7 @@
                         relation_model = relation.mapper.class_
                         field = getattr(relation_model, field_name_in_relation)
                         direction = getattr(field, val.direction)
-                        query = query.join(relation_model)
+                        query = query.join(relation)
                         query = query.order_by(direction())
                     else:
                         field = getattr(model, val.field)