繁体   English   中英

Python在查询SQLAlchemy关联表时返回AttributeError('function'对象没有属性'c')

[英]Python returns AttributeError when querying a SQLAlchemy association table ('function' object has no attribute 'c')

我有一个名为“followers”的 Flask-SQLAlchemy 关联表,当我通过 REPL 运行查询以下查询时,它运行良好,但是在 Flask 应用程序上运行代码时,它给了我错误“'AttributeError:'function' object has no属性'c'”。

调用查询的函数

@app.route('/following/<int:user_id>', methods=['GET'])
@login_required
def following(user_id):
    """
    Show all the Tutors the user is following
    """

    user = Users.query.get(user_id)
    
    page = request.args.get('page', 1, type=int)

    result = db.session.query(Users, Tutors)\
        .join(Tutors, Tutors.user_id==Users.id ,full=True)\
        .join(followers, Tutors.id == followers.c.followed_id)\
        .filter(user_id==followers.c.follower_id).all()
    
    next_url = url_for('index', page=result.next_num) if result.has_next else None
    prev_url = url_for('index', page=result.prev_num) if result.has_prev else None

    data = {}
    data['user'] = []
    data['tutor'] = []
    rows = len(result.items)

    for i in range(rows):
        data['user'].append(result.items[i][0])
        data['tutor'].append(result.items[i][1])

    return render_template('index.html', title='Following', 
                        data=data, rows=rows,
                        next_url=next_url, prev_url=prev_url)

只是查询

    result = db.session.query(Users, Tutors)\
        .join(Tutors, Tutors.user_id==Users.id ,full=True)\
        .join(followers, Tutors.id == followers.c.followed_id)\
        .filter(user_id==followers.c.follower_id).all()

楷模

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('tutors.id'))
)

class Users(UserMixin, db.Model):
    __tablename__ = 'users'
    __table_args__ = {'extend_existing': True}
    id = db.Column(db.Integer, primary_key=True)

    ... (other non-related properties)

    followed = db.relationship('Tutors', secondary=followers, lazy='dynamic',
        backref=db.backref('followers', lazy='dynamic'))

class Tutors(db.Model):
    __tablename__ = 'tutors'
    __table_args__ = {'extend_existing': True}
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    ... (other non-related properties)

错误回溯

Error on request:
Traceback (most recent call last):
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/werkzeug/serving.py", line 323, in run_wsgi
    execute(self.server.app)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/werkzeug/serving.py", line 312, in execute
    application_iter = app(environ, start_response)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/env/lib/python3.8/site-packages/flask_login/utils.py", line 272, in decorated_view
    return func(*args, **kwargs)
  File "/Users/richardnienkotter/Documents/Projects/codetutors/app/routes.py", line 134, in following
    result = db.session.query(Users, Tutors, followers.c.follower_id, followers.c.followed_id)\
AttributeError: 'function' object has no attribute 'c'

在调试控制台上使用 type() 表明 'followers' 是一个函数,这就是问题的根源,但为什么将它作为函数调用?

解决方案

在 routes.py 中,视图函数和关联表的名称相同,这导致了问题。

感谢阿比的帮助:)

请检查名为"/Users/richardnienkotter/Documents/Projects/codetutors/app/routes.py", line 134, in following的文件"/Users/richardnienkotter/Documents/Projects/codetutors/app/routes.py", line 134, in following

可能有一个名为followers的函数,这与您命名为followers的表相矛盾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM