代码之家  ›  专栏  ›  技术社区  ›  CL So

在烧瓶服务器中使用烧瓶sqlalchemy的正确方法是什么?

  •  0
  • CL So  · 技术社区  · 7 年前

    这是模型代码,我已经测试过了,没有错误,它可以在数据库中创建表和记录

    创世记

    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 回复  |  直到 7 年前
        1
  •  0
  •   SuperShoot npburns224    7 年前

    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 打电话 app 把这个传给 SQLAlchemy 构造函数将结果赋给变量, db (实际上,当您导入 createdb 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.py代码我已经做了更详细的注释,但不足的是 app.run() 拜访 App.Py 不是在 应用程序 那个 createdb.db 意识到。

    推荐文章