检查 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 应用程序的正确方法是什么?
没有正确的方法,因为这完全取决于您希望如何使用 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)
来自: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()必须存在。
| 归档时间: |
|
| 查看次数: |
9293 次 |
| 最近记录: |