【问题标题】:OperationalError: (OperationalError) no such columnOperationalError:(OperationalError)没有这样的列
【发布时间】:2013-08-20 07:43:01
【问题描述】:

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

@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 不存在于考试/学生中

【问题讨论】:

    标签: python-2.7 sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您有两个相同问题的案例。您的查询包含 StudentFavorites 的信息,这意味着它知道 StudentFavorites.student_id 和 StudentFaovrites.exams_id。它对Students.id、Exames.id 和Exames.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)
    

    【讨论】:

    • 非常感谢,我之前也尝试过,但没有成功:(还有其他想法吗?我稍后尝试发布表格结构,但必须使其更小
    • 您从连接中得到的错误是什么?此外,您在这里有一个多对多的关系,因此如果您从第二个链接查看查询,这应该很容易组合在一起(假设您的关系组合正确)。
    • 如果我像上面的代码一样编辑它,我会得到同样的错误。我已经编辑了第一个帖子并导入了 StudentFavorits 表。作为考试表,我认为这会有所帮助。
    • 嘿,我觉得有误会。我只想删除StudentFavorites表中的条目,而不是其他表中的条目,可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2016-02-20
    • 2015-02-25
    • 2014-12-06
    • 2020-08-16
    • 2020-12-01
    • 2021-01-12
    相关资源
    最近更新 更多