在Flask服务器中使用Flask-SQLAlchemy的正确方法是什么?

时间:2018-10-30 10:35:32

标签: python flask sqlalchemy flask-sqlalchemy

这是模型代码,我已经测试过该代码,没有错误,它可以在DB中创建表,记录

createdb.py

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost:3306/ai'
db = SQLAlchemy(app)

if __name__ == 'createdb':
    db.reflect()
    db.drop_all()
    db = SQLAlchemy(app)

class Class(db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    label = db.Column(db.String(255), unique=True, nullable=False)

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

    def __repr__(self):
        return '<Class %r>' % self.username

class Photo(db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    path = db.Column(db.String(1024), nullable=False)

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

    def __repr__(self):
        return '<Photo %r>' % self.username

class PhotoClass(db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    photoId = db.Column(db.Integer, db.ForeignKey('photo.id'), nullable=False)
    classId = db.Column(db.Integer, db.ForeignKey('class.id'), nullable=False)
    score = db.Column(db.Float, nullable=False)

    def __init__(self, photoId, classId):
        self.photoId = photoId
        self.classId = classId

    def __repr__(self):
        return '<PhotoClass %r>' % self.username

if __name__ == 'createdb':
    db.create_all()
    db.session.add(Class('Plain'))
    db.session.add(Class('Printed'))
    db.session.commit()

这是服务器代码

app.py

import createdb

app = Flask(__name__)

@app.route('/')
def index():
    createdb.db.session.add(createdb.Class('aaa'))
    createdb.db.session.commit()
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

如果我导入到服务器,它仍然没有错误,当我进入localhost:5000时,会出现此错误

track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'

这是完全错误

[2018-10-30 18:31:03,288] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "C:\python\lib\site-packages\sqlalchemy\util\_collections.py", line 999, in __call__
    return self.registry[key]
KeyError: 12344

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\python\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\python\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\python\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\python\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
  File "C:\python\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\python\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "E:\0\airbtn\yeetungaiserver\app.py", line 17, in index
    createdb.db.session.add(createdb.Class('aaa'))
  File "C:\python\lib\site-packages\sqlalchemy\orm\scoping.py", line 153, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "C:\python\lib\site-packages\sqlalchemy\util\_collections.py", line 1001, in __call__
    return self.registry.setdefault(key, self.createfunc())
  File "C:\python\lib\site-packages\sqlalchemy\orm\session.py", line 2950, in __call__
    return self.class_(**local_kw)
  File "C:\python\lib\site-packages\flask_sqlalchemy\__init__.py", line 142, in __init__
    track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'

1 个答案:

答案 0 :(得分:0)

createdb.py中:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost:3306/ai'
db = SQLAlchemy(app)

if __name__ == 'createdb':
    db.reflect()
    db.drop_all()
    db = SQLAlchemy(app)

您创建名为Flask的{​​{1}}实例,并将其传递给app构造函数,将结果分配给变量SQLAlchemy(实际上,当您从db导入createdb)。它们的关键点是app.py实例化了db实例Flask

然后进入app.py:

createdb.app

我在上面为您的app.py代码添加了更多详细信息,但简短之处在于import createdb # createdb.app is created upon import app = Flask(__name__) # but you create a new `Flask` instance called app @app.route('/') def index(): # all of the below db operations occur on createdb.db which is in the # createdb.app context, not the context of app created in this module createdb.db.session.add(createdb.Class('aaa')) createdb.db.session.commit() return render_template('index.html') if __name__ == '__main__': # the app you run here, isn't the app that was made available to db in # in createdb.py. It has no idea what db is! app.run() # try createdb.app.run() 中的app.run()调用并未在{{1 1}}知道。