一. Flask-SQLAlchemy 初始化源码
在文件中定义了工厂函数 create_app :
def create_app(config):
""" 可以根据传入的 config 名称,加载不同的配置
"""
app = Flask(__name__)
app.config.from_object(configs.get(config))
# SQLAlchemy 的初始化方式改为使用 init_app
db.init_app(app)
如上所示的最后一行代码,db 对象一般是在models.py
文件中定义的 SQLAlchemy 类的实例,db = SQLAlchemy()
。这里将应用对象作为参数调用实例的 init_app
方法进行初始化。
到现在为止我们只知道初始化,但并不知道实际发生了什么。
我们看下 SQLAlchemy 这个类的源码,首先它是来自 flask_sqlalchemy.__init__
模块中:
cd /usr/local/lib/python3.8/dist-packages/flask_sqlalchemy
sudo vim __init__.py
class SQLAlchemy(object):
"""This class is used to control the SQLAlchemy integration to one
or more Flask applications. Depending on how you initialize the
object it is usable right away or will attach as needed to a
Flask application.
There are two usage modes which work very similarly. One is binding
the instance to a very specific Flask application::
app = Flask(__name__)
db = SQLAlchemy(app)
因为在创建该类的实例的时候,没有提供参数,我们就直接看 init_app 方法的源码:
如上图所示,init_app 方法只需要提供一个 app 参数,也就是应用对象。
在第 847 行有一个判断,要求 app.config 这个类字典对象中必须要有 SQLALCHEMY_DATABASE_URI
或者 SQLALCHEMY_BINDS
这两个配置项中的一个,不然就会抛出一个警告信息:默认使用 SQLite3 作为数据库。
我们已经在配置文件中定义了 SQLALCHEMY_DATABASE_URI ,所以不会出现这个警告。
下面就是一堆给 app.config 字典对象添加默认键值对的操作。
继续向下查看源码,如下图所示第 884 行是最重要的:
应用对象在初始化的时候,定义了一个 extensions
属性,属