2

我有个问题。我必须做这个查询:

@app.route('/api/subscriptions/<string:id>', methods=('DELETE',))
@decorators.login_required
def delete_subscription(id):
    dbsession = DBSession()
    session = Session()
    favorit = (dbsession.query(StudentsFavorites)
      .filter(Exams.number == str(id))
      .filter(StudentsFavorites.exam_id)
      .filter(Students.id == StudentsFavorites.student_id)
      .filter(Students.id == str(session.get_user_id()))
      .delete()         )
    dbsession.flush()
    return jsonify(error=False)

但是当我做这个查询时,我得到了这个异常:

OperationalError: (OperationalError) no such column: exams.number u'DELETE FROM students_favorites WHERE exams.number = ? AND students_favorites.exam_id AND students.id = students_favorites.student_id AND students.id = ?' ('123123123', 'a24213')

桌子很大,有很多信息,所以我不能全部发布。但是这个查询有效:

@app.route('/api/subscriptions/<string:id>', methods=('PUT',))
@decorators.login_required
def add_subscription(id):
    dbsession = DBSession()
    session = Session()
    examID = (dbsession.query(Exams.id)
     .filter(Exams.number == id).first()
     )
    favorit=StudentsFavorites(student_id=session.get_user_id(), exam_id=examID.id)
    dbsession.add(favorit)
    dbsession.flush()
    return jsonify(error=False)

表格的简短视图:

table: Exams
rows: id, number (number is the id i put into the function)

table: StudentsFavorites
rows: student_id, exams_id

table: Students
rows: id

我真的不明白,为什么他没有找到异常中的数字行。

编辑:

数据库学生最爱:

class StudentsFavorites(Base):
    """N:M resolve model for the exams to the semester.
    """

    __tablename__ = "students_favorites"

    student_id = Column(Unicode(255), ForeignKey("students.id"), primary_key=True, autoincrement=False)

    exam_id = Column(Integer, ForeignKey("exams.id"),            primary_key=True, autoincrement=False)

    created_at = Column(DateTime, nullable = False, default = datetime.now)

    student = relationship("Students", uselist = False, lazy="joined")

    exam = relationship("Exams", uselist=False, lazy="joined")

像这样的东西?我试过这个:

    (dbsession.query(StudentsFavorites)
           .filter(StudentsFavorites.exam.id == str(id))
           .filter(StudentsFavorites.student.id == str(session.get_user_id()))
           .delete()
 )

但是得到了错误,那个 id 在考试/学生中不存在

4

1 回答 1

0

您有两个相同问题的案例。您的查询包含 StudentFavorites 的信息,这意味着它知道StudentFavorites.student_idStudentFaovrites.exams_idStudents.id它对和Exames.id什么都不知道Exames.number为了让您查询 StudentFavorites 对象并让它知道您将必须执行 sql join 的其他值

加入在 sqlalchemy 中工作可能会有点痛苦(嗯......在常规 sql 中也是如此)。因为我不知道你的表模式是什么,所以我不能谈论它,但视图应该看起来像这样。

@app.route('/api/subscriptions/<string:id>', methods=('DELETE',))
@decorators.login_required
def delete_subscription(id):
    dbsession = DBSession()
    session = Session()
    favorit = (dbsession.query(StudentsFavorites)
      .join(Exames)
      .join(students)
      .filter(Exams.number == str(id))
      .filter(StudentsFavorites.exam_id)
      .filter(Students.id == StudentsFavorites.student_id)
      .filter(Students.id == str(session.get_user_id()))
      .delete()         )
    dbsession.flush()
    return jsonify(error=False)

或者,如果您使用 ORM 创建表,您可以考虑在表语句中设置外键关系

您的第二个示例有效的原因是因为您正在对考试表指定查询并且仅使用在该表中找到的值。

对编辑的回应: 现在您的表关系设置不正确。特别是以下部分:多对多从多对多表中删除行

此示例代码在发布的链接中进行了更多(更好)的详细说明,但基本思想是您有一个 associate_table(在您的情况下为 StudentFavorites)包含外键,这些外键具有在您的一个或多个其他中指定的关系表。我个人建议您使用表格示例而不是对象示例。

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Child",
                    secondary=association_table,
                    backref="parents")

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
于 2013-08-20T08:28:01.937 回答