检查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的正确方法是什么?
答案 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)