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

7 python sqlalchemy flask

检查 Flask 和 Flask-SQLAlchemy 文档我有一个困惑,如果我有:

模型.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)
Run Code Online (Sandbox Code Playgroud)

配置文件:

import os

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

应用程序.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()
Run Code Online (Sandbox Code Playgroud)

是必要的使用:

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
Run Code Online (Sandbox Code Playgroud)

将 SQLAlchemy 的数据库分配给 Flask 应用程序的正确方法是什么?

Jes*_*ssi 6

没有正确的方法,因为这完全取决于您希望如何使用 SQLAlchemy 和使用 Flask 的应用程序实例化您的数据库。但我将介绍我如何使用该应用程序。

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)
Run Code Online (Sandbox Code Playgroud)


Zep*_*hro 5

来自:https : //flask-sqlalchemy.palletsprojects.com/en/2.x/api/

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

app = Flask(__name__)
db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)

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

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    return app
Run Code Online (Sandbox Code Playgroud)

两者之间的区别在于,在第一种情况下,方法 likecreate_all()和drop_all()将一直有效,但在第二种情况下 aflask.Flask.app_context()必须存在。