Flask-Restless GET请求抛出SQLAlchemy错误

时间:2012-12-20 18:09:41

标签: python flask flask-sqlalchemy flask-extensions

我需要为Flask应用程序实现一个API,并且已经看到Flask-Restless的建议。我只是使用这个库的基本用法,并且希望使用它的人可以提供帮助。

创建API管理器和端点......

manager = APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Gallery, methods=['GET', 'POST', 'PUT', 'DELETE'])

......以及与之相关的模型

class Gallery(db.Model):
    __tablename__ = 'galleries'
    id = db.Column(db.Integer, primary_key=True)

    title = db.Column(db.String(25))

    def __init__(self, title):
        self.title = title

现在,要插入新条目,我使用此jQuery ajax POST请求。这很好用。我在sqlite db viewer中测试了它,可以看到条目。

$('#form').on('submit', function(e){
        $.ajax({
            type: 'post',
            url: '/api/galleries',
            contentType:"binary/octet-stream",
            data: JSON.stringify({'title': $('#title').val()}),
            success: function(){
                alert('Success!');
            }
        });
        e.preventDefault();
    });

这是问题所在。我在浏览器中转到http://localhost:5000/api/galleries并收到以下消息:

  

sqlalchemy.orm.exc.NoResultFound
  NoResultFound:找不到一行()

的行

奇怪的是,当api/galleries返回db条目列表时,它会尝试运行one()。我尝试api/galleries/1并得到完全相同的错误。我仔细检查过,主要身份证是1.我错过了什么?

1 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题并通过一些解决方法解决了这个问题。

以下是我的模特的样子:

    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        ...

    class Key(db.Model):
        user_id = db.Column(db.Integer, db.ForeignKey('auth_user.id'))
        user = db.relationship('User', backref=db.backref('keys', lazy='dynamic'))
        ...

<强>原因:

查询users时收到相同的错误消息。而且我发现那个不安定的人试图查询我keys的相关users,不幸的是,我的key表是空的,我收到了错误消息。

解决方法:

在创建API时,使用 include_columns exclude_columns 排除keys列:

    api_mgr.create_api(User, include_columns = ['email', 'username'])

或:

    api_mgr.create_api(User, exclude_columns = ['keys', 'SOME_OTHER_COLUMNS'])

您可以查看是否存在导致问题的相关表格。如果是原因,您可以使用 include_columns exclude_columns 关键字参数。