2013-08-20 145 views
2

我遇到問題。我不得不這樣做查詢:OperationalError:(OperationalError)no such column

@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 

我真的不明白,他爲什麼不找數行中的例外。

編輯:

數據庫StudentsFavorites:

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沒有在考試中存在/學生

回答

0

你有同樣的問題的兩種情況。您的查詢有關於StudentFavorites的信息,這意味着它瞭解StudentFavorites.student_idStudentFaovrites.exams_id。它不知道任何關於Students.idExames.idExames.numberIn order for you to query a StudentFavorites object and have it know about those other values you're going to have to perform a sql join

Join's可能會在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) 

Alternatively, you can look into setting up Foreign key relationships in your table statements if you use the ORM to create your tables

你的第二個例子作品的原因是因爲你指定了考試表的查詢和使用只在該表中找到的值。

響應編輯: Right now your table relationships aren't set up correctly.具體的章節:許多要從許多許多刪除行到許多表

此示例代碼在得多(更好)詳細地解釋發佈的鏈接,但基本的想法是,你有一個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) 
+0

非常感謝,我也嘗試過這一點,但它沒有工作:(任何其他的想法?我稍後再嘗試發佈tablestructure,但必須把它縮小 –

+0

什麼,你是錯誤從連接開始?還有,你在這裏有多對多的關係,所以如果你檢查第二個鏈接的查詢,這應該很容易放在一起(假設你的關係放在一起)。 – AlexLordThorsen

+0

如果我像上面的代碼那樣編輯它,我得到了同樣的錯誤。我編輯了第一篇文章並導入了StudentFavorits表。作爲考試表,我認爲這有助於多一點。 –

相關問題