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

同じ問題の 2 つのケースがあります。クエリには StudentFavorites の情報が含まれています。これは、 と について知っていることを意味しStudentFavorites.student_idますStudentFaovrites.exams_idStudents.idExames.idおよびについては何も知りませんExames.numberStudentFavorites オブジェクトにクエリを実行し、他の値を認識させるには、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 を使用してテーブルを作成する場合は、テーブル ステートメントで外部キー関係を設定することを検討できます。

2 番目の例が機能する理由は、試験テーブルに対してクエリを指定し、そのテーブルで見つかった値のみを使用しているためです。

編集への応答: 現在、テーブルの関係が正しく設定されていません。特にセクション:多対多および多対多テーブルからの行の削除

このコード例は、投稿されたリンクでより詳細に (そしてより適切に) 説明されていますが、基本的な考え方は、associate_table (あなたの場合は StudentFavorites) に、他の 1 つ以上で指定された関係を持つ外部キーが含まれているということです。テーブル。オブジェクトの例ではなく、テーブルの例を使用することを個人的にお勧めします。

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 に答える