有必要使用db.init_app或SQLAlchemy(app)在Flask中是一样的吗?

时间:2018-03-20 15:48:30

标签: python flask sqlalchemy

检查Flask和Flask-SQLAlchemy doc我有一个混乱,如果我有:

models.py

from flask_sqlalchemy import SQLAlchemy
#:Use or not
db = SQLAlchemy()

class User(db.Model):
 __tablename__ = "USERS"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(25), nullable=False)
    password = db.Column(db.String(255), nullable=False)

config.py

import os

class Config(object):
    DEBUG = True
    SECRET_KEY = os.urandom(12)
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = "mysql://root:@localhost/example"

app.py

from config import Config
from models import db
from models import User

app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)

if __name__ == "__main__":
    db.init_app(app)
    with app.app_context():
        db.create_all()
    app.run()

是必要的用途:

db = SQLAlchemy(app)之后

app.config.from_object(Config)db.init_app(app)是一样的吗?

因为我在db = SQLAlchemy()中创建了一些只有models.py并且db.init_app(app)之前有app.run()的烧瓶的例子

所以在db = SQLAlchemy(app)中使用app.py覆盖并且没有db.init_app(app)

创建了示例

我打印了两个值并得到:

with only db in models:

<SQLAlchemy engine=None>
the problem is:
The app create the tables in my database
But engine=None

with db = SQLAlchemy(app) override

<SQLAlchemy engine=mysql://root:***@localhost/hsl_db?charset=utf8>

the problem is:
The app dont create the tables in my database

将SQLAlchemy数据库分配给Flask app的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

发件人:https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/

有两种用法非常相似。一种是将实例绑定到非常特定的Flask应用程序:

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

第二种可能性是一次创建对象,然后配置应用程序以支持它:

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    return app

两者之间的区别在于,在第一种情况下,create_all()drop_all()之类的方法将一直有效,而在第二种情况下,必须存在flask.Flask.app_context()

答案 1 :(得分:2)

没有正确的方法,因为它取决于您希望如何使用Flask使用SQLAlchemy和app来实例化数据库。 但我会回顾一下我如何使用该应用程序。

def create_app():
    app = Flask(__name__, static_folder='static', instance_relative_config=True)
    app.config.from_pyfile('app_config.py')
    return app

app = create_app()
db = SQLAlchemy(app)

答案 2 :(得分:1)

Flask文档建议:

db.init_app(app)

Flask Factories & Extensions