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

Я действительно не понял, почему он не нашел числовую строку в исключении.

ИЗМЕНИТЬ:

База данных СтудентыИзбранное:

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 не существует на экзаменах / студент


person Björn    schedule 20.08.2013    source источник


Ответы (1)


У вас два случая одной и той же проблемы. В вашем запросе есть информация для StudentFavorites, что означает, что он знает о StudentFavorites.student_id и StudentFaovrites.exams_id. Он ничего не знает о Students.id, Exames.id и Exames.number. Чтобы вы могли запросить StudentFavorites object и сообщите ему о тех других значениях, которые вам понадобятся для выполнения соединения sql.

Присоединение может быть чем-то вроде боли в заднице, чтобы начать работать в 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 для создания своих таблиц

Причина, по которой ваш второй пример работает, заключается в том, что вы указываете запрос по таблице экзамена и используете только значения, найденные в этой таблице.

Ответ на редактирование: Сейчас ваши отношения между таблицами не t настроены правильно. В частности, разделы: Многие ко многим и Удаление строк из таблицы «многие ко многим».

Этот пример кода объясняется гораздо более подробно (и лучше) в опубликованной ссылке, но основная идея заключается в том, что у вас есть ассоциация_таблица (в вашем случае 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)
person AlexLordThorsen    schedule 20.08.2013
comment
Большое спасибо, я тоже пробовал это раньше, но это не сработало :( Есть другие идеи? Я попытаюсь опубликовать структуру таблицы позже, но мне нужно сделать ее меньше. - person Björn; 20.08.2013
comment
Какую ошибку вы получаете от соединений? Кроме того, здесь у вас есть отношение «многие ко многим», поэтому, если вы проверите запрос по второй ссылке, это должно быть довольно легко собрать (при условии, что ваши отношения составлены правильно). - person AlexLordThorsen; 20.08.2013
comment
Если я отредактирую его, как ваш код выше, я получу ту же ошибку. Я отредактировал первую публикацию и импортировал таблицу StudentFavorits. Я думаю, что это поможет немного больше, чем таблица экзаменов. - person Björn; 20.08.2013
comment
Эй, я думаю, что есть недоразумение. Я хочу удалить запись только в таблице StudentFavorites, а не в других таблицах, возможно ли это? - person Björn; 20.08.2013