Python 使用init_app()向当前应用程序注册sqlalchemy扩展

Python 使用init_app()向当前应用程序注册sqlalchemy扩展,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在尝试在新环境中运行现有应用程序。该应用程序在以前的环境中运行良好,但当我在本地运行时,它拒绝与我的数据库连接 AssertionError: The sqlalchemy extension was not registered to the current application. Please make sure to call init_app() first. 我感到困惑的是,这段代码在以前的环境中工作。它要求我调用init_应用程序,但据我所知,只有在有多个应用程序的情况下才

我正在尝试在新环境中运行现有应用程序。该应用程序在以前的环境中运行良好,但当我在本地运行时,它拒绝与我的数据库连接

AssertionError: The sqlalchemy extension was not registered to the current application.  Please make sure to call init_app() first.
我感到困惑的是,这段代码在以前的环境中工作。它要求我调用init_应用程序,但据我所知,只有在有多个应用程序的情况下才会调用,而实际上没有

在调试模式下,应用程序不会识别对象,即

>>> type(Candidate)
<class 'flask_sqlalchemy.model.DefaultMeta'>
但这并没有产生任何影响

文件夹结构

app
- static folder
- templates folder
- _init_.py
- config.py
- views.py
- run.py
- Procfile

您可以在init.py中尝试以下代码和结构


您可以在init.py中尝试以下代码和结构


问题是有一些遗留代码应该被删除。我不小心初始化了一个应用程序两次

问题在于,有一些遗留代码应该被删除。我不小心初始化了一个应用程序两次

与其创建init.py,不如直接从模型导入db

下面的代码显示了my models.py和table students

from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy


#initialize this two objects below app and db parameters so that app.py will have the same db session.
#then in app.py add from models import db
#finally add db.init_app(app) at the bottom of app.py or  run.py

app = Flask(__name__)
db = SQLAlchemy(app)



class Students(db.Model):
   id = db.Column('student_id', db.Integer, primary_key = True)
   name = db.Column(db.String(50))
   email = db.Column(db.String(50))

def __repr__(self):
        return '<Student {}>'.format(self.email)
通过移动下面两行代码,可以减轻sql alchemy的断言错误 紧跟在这行代码的后面,朝着底部

if __name__ == '__main__':
因此,代码将如下所示,并且您的应用程序将毫无问题地运行

if __name__ == '__main__':
   #create table
   db.create_all()
   db.init_app(app)


# remember to turn app debug by setting it to false in production
   app.run(debug=True)
与其创建init.py,不如直接从模型导入db

下面的代码显示了my models.py和table students

from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy


#initialize this two objects below app and db parameters so that app.py will have the same db session.
#then in app.py add from models import db
#finally add db.init_app(app) at the bottom of app.py or  run.py

app = Flask(__name__)
db = SQLAlchemy(app)



class Students(db.Model):
   id = db.Column('student_id', db.Integer, primary_key = True)
   name = db.Column(db.String(50))
   email = db.Column(db.String(50))

def __repr__(self):
        return '<Student {}>'.format(self.email)
通过移动下面两行代码,可以减轻sql alchemy的断言错误 紧跟在这行代码的后面,朝着底部

if __name__ == '__main__':
因此,代码将如下所示,并且您的应用程序将毫无问题地运行

if __name__ == '__main__':
   #create table
   db.create_all()
   db.init_app(app)


# remember to turn app debug by setting it to false in production
   app.run(debug=True)

以前和当前的环境是什么?你的文件夹结构是什么样的?您使用的是virtualenv吗?理论上,以前的环境和当前的环境应该是相同的,因为我安装了my requirements.txt,并且正在使用virtualenv。文件夹结构高于以前和当前的环境是什么?你的文件夹结构是什么样的?您使用的是virtualenv吗?理论上,以前的环境和当前的环境应该是相同的,因为我安装了my requirements.txt,并且正在使用virtualenv。文件夹结构位于已创建数据库的上方。这不会覆盖它吗?数据库会被覆盖。通过这样做,您可以导入db而不会与app发生冲突。好的,我不能覆盖DBEmmm,db是一个SQLAlchemy对象,而不是一个真正的数据库。Thx。添加db.init_app(我在其中初始化我的应用程序)会更改错误。现在它无法识别我的DB表-sqlalchemy.exc.OperationalError OperationalError:sqlite3.OperationalError没有这样的表。我尝试了db.create_,但是没有用。数据库已经创建。这不会覆盖它吗?数据库会被覆盖。通过这样做,您可以导入db而不会与app发生冲突。好的,我不能覆盖DBEmmm,db是一个SQLAlchemy对象,而不是一个真正的数据库。Thx。添加db.init_app(我在其中初始化我的应用程序)会更改错误。现在它无法识别我的DB表-sqlalchemy.exc.OperationalError OperationalError:sqlite3.OperationalError没有这样的表。我试过db.create_,但都没用。