在flask sqlalchemy中创建数据库

时间:2017-05-01 01:29:45

标签: python flask flask-sqlalchemy

我正在使用Flask-SQLAlchemy构建Flask应用程序,我正在尝试编写一个脚本,该脚本将在不运行主应用程序的情况下创建Sqlite3数据库。为了避免循环引用,我在单独的模块中初始化了主要的Flask应用程序对象和SQLAlchemy数据库对象。然后,我在运行应用程序时将它们导入并合并到第三个文件中。这在我运行应用程序时工作正常,因为数据库是在构建行并查询它们时构建并正常运行的。但是,当我尝试在另一个模块中导入它们时,我收到以下错误:

RuntimeError: application not registered on db instance and no applicationbound to current context

我的代码如下所示:

根/ create_database.py

from application.database import db
from application.server import app

db.init_app(app)

db.create_all()

根/ run.sh

export FLASK_APP=application/server.py
flask run

根/应用/的初始化的.py

from database import db
from server import app

db.init_app(app)    

from routes import apply_routes   
apply_routes(app)

根/应用/ database.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

根/应用/ server.py

from flask import Flask
import os
app = Flask(__name__)

path = os.path.dirname( os.path.realpath(__file__) )
database_path = os.path.join(path, '../mydb.sqlite')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + database_path

根/应用/模型/的初始化的.py

from user import User

根/应用/模型/ user.py

from application.database import db

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

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

在我的create_database.py脚本中,我正在尝试确保SQLAlchemy db实例配置了app对象的配置详细信息,但它似乎没有连接某些原因。我错过了一些重要的东西吗?

1 个答案:

答案 0 :(得分:4)

您必须创建请求,或者必须直接使用sqlalchemy创建模型。我们在工作中做了类似的事情并选择了前者。

Flask允许您创建测试请求以初始化应用程序。尝试像

这样的东西
from application.database import db
from application.server import app

with app.test_request_context():
     db.init_app(app)

     db.create_all()