首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OperationalError:(OperationalError)没有这样的列

OperationalError:(OperationalError)没有这样的列
EN

Stack Overflow用户
提问于 2013-08-20 07:43:01
回答 1查看 3.9K关注 0票数 2

我有个问题。我必须执行以下查询:

代码语言:javascript
复制
@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)

但是,当我执行这个查询时,我得到了这个异常:

代码语言:javascript
复制
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')

这些桌子很大,而且有很多信息,所以我不能全部发出去。但是这个查询是有效的:

代码语言:javascript
复制
@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)

对表的简短看法:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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")

像这样吗?我试过这个:

代码语言:javascript
复制
    (dbsession.query(StudentsFavorites)
           .filter(StudentsFavorites.exam.id == str(id))
           .filter(StudentsFavorites.student.id == str(session.get_user_id()))
           .delete()
 )

但是得到了错误,在考试/学生中不存在我的身份

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-20 08:28:01

你有两例同样的问题。您的查询包含StudentFavorites的信息,这意味着它了解StudentFavorites.student_idStudentFaovrites.exams_id。它对Students.idExames.idExames.number一无所知。为了让您查询一个StudentFavorites对象,并让它知道需要执行一个sql的其他值

Join在炼金术上工作可能有点痛苦(嗯.在普通sql中也是如此。因为我不知道您的表模式是什么,所以我不能讨论这个问题,但是视图应该是这样的。

代码语言:javascript
复制
@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创建表,则可以查看如何在表语句中设置外键关系

第二个示例之所以有效,是因为您指定了对检查表的查询,并且只使用了该表中的值。

对编辑的响应: 现在,您的表关系没有正确设置。,特别是以下部分:,多到多,,从多到多表中删除行

这个示例代码在posted链接中解释得更详细(更好),但基本思想是,您有一个associate_table (在您的例子中是StudentFavorites)包含外键,该外键具有在一个或多个其他表中指定的关系。我个人建议您使用表示例,而不是对象示例。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18329539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档