2013-08-20 7 views
2

문제가 있습니다. 나는이 쿼리 할 필요가 :OperationalError : (OperationalError) 해당 열이 없습니다.

@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") 

뭔가? 나는이 시도 : 해당 ID가/학생

답변

0

시험에

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

을하지만 오류가 발생했습니다 존재하지 않았다 동일한 문제 두 가지 사례를 가지고있다. 귀하의 질의에는 StudentFavorites에 대한 정보가 있습니다. 이는 약 StudentFavorites.student_idStudentFaovrites.exams_id을 의미합니다. Students.id, Exames.idExames.number에 대해서는 알지 못합니다. In 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.

가입은 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 테이블을 가져 왔습니다. 나는 이것이 시험 테이블처럼 조금 더 도움이된다고 생각한다. –

관련 문제