2017-03-17 25 views
0

實施燒瓶的SQLAlchemy我燒瓶Restplus時,我只是有一個問題。它始終顯示錯誤:sqlalchemy.orm.exc.UnmappedInstanceError:類「 __main __用戶」未對應燒瓶的SQLAlchemy

sqlalchemy.orm.exc.UnmappedInstanceError: Class '__main__.User' is not mapped 

我下面寫的代碼是燒瓶Restplus示例項目的GitHub上的簡化版本(1個文件):https://github.com/postrational/rest_api_demo

我一遍又一遍檢查,但不知道爲什麼錯誤仍然出現。

這裏是我的代碼:

from flask import Flask, request 
from flask_sqlalchemy import SQLAlchemy 
from flask_restplus import Resource, Api, fields 

app = Flask(__name__) 
api = Api(app, version='v0.1') 
db = SQLAlchemy(app) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 
db.init_app(app) 

ns = api.namespace('users', description='User API') 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(80)) 
    password = db.Column(db.String(80)) 

    def __init__(self, email, password): 
     self.email = email 
     self.password = password 

    def __repr__(self): 
     return '<User %s>' % self.email 


user = api.model('user', { 
    "id": fields.Integer(readOnly=True), 
    "email": fields.String(required=True), 
    "password": fields.String(required=True), 
}) 


def create_user(data): 
    email = data.get('email') 
    password = data.get('password') 

    user = User(email, password) 

    db.session.add(user) 
    db.session.commit() 

def update_user(user_id, data): 
    user = User.query.filter(User.id == user_id).first() 
    user.email = data.get('email') 
    user.password = data.get('password') 

    db.session.add(user) 
    db.session.commit() 

def delete_user(user_id): 
    user = User.query.filter(User.id == user_id).first() 

    db.session.delete(user) 
    db.session.commit() 


@ns.route('/') 
class UserList(Resource): 
    @ns.marshal_list_with(user) 
    def get(self): 
     users = User.query.all() 
     return users 

    @ns.marshal_with(user) 
    @ns.expect(user) 
    def post(self): 
     data = request.json 
     create_user(data) 
     return None, 201 

@ns.route('/<int:id>') 
class User(Resource): 
    @ns.marshal_with(user) 
    def get(self, id): 
     user = User.query.filter(User.id == id).first() 
     return user 

    @ns.expect(user) 
    @ns.marshal_with(user) 
    def put(self, id): 
     data = request.json 
     user = update_user(id, data) 
     return None, 204 

    def delete(self, id): 
     delete_user(id) 
     return None, 204 


db.create_all() 

user = User(email= '[email protected]', password= '4324dsfdsfa') 
db.session.add(user) 
db.session.commit() 

user = User(email= '[email protected]', password= '5435rs') 
db.session.add(user) 
db.session.commit() 

users = User.query.all() 
print users 

if __name__ == "__main__": 

    app.run(debug=True) 

有什麼我錯過了代碼?我使用python2.7反正..

回答

0

Im相當肯定的,因爲你是超載User.__init__,但你沒有調用super,所以做到這一點,看看它是否映射:

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(80)) 
    password = db.Column(db.String(80)) 

    def __init__(self, email, password): 
     self.email = email 
     self.password = password 
     super(User,self).__init__() 

    def __repr__(self): 
     return '<User %s>' % self.email 
+0

我剛剛叫超上我的模型初始化,但似乎沒有奏效。我試圖用新模型創建新項目,它工作。不知道這裏發生了什麼 – rizkiaditya24