create_engine与app.config['SQLALCHEMY_DATABASE_URI']的区别是什么?
create_engine函数和app.config['SQLALCHEMY_DATABASE_URI']配置项看起来功能相同,它们只是两种不同的数据库连接方式吗?
核心区别与关联
create_engine是SQLAlchemy原生核心方法
它是SQLAlchemy库的底层核心函数,作用是直接创建Engine对象——这个对象是SQLAlchemy与数据库交互的核心入口,负责管理连接池、执行原生SQL语句等。这种方式适合不需要Flask框架的独立脚本、命令行工具或非Web项目,直接通过原生SQL操作数据库。示例代码:
from sqlalchemy import create_engine from sqlalchemy import text engine = create_engine("postgresql+psycopg2://scott:tiger@localhost:5432/mydatabase") with engine.connect() as connection: result = connection.execute(text("select username from users")) for row in result: print("username:", row["username"])SQLALCHEMY_DATABASE_URI是Flask-SQLAlchemy的配置项
Flask-SQLAlchemy是SQLAlchemy针对Flask框架的封装扩展,这个配置项用于指定数据库连接的URI。当你调用db.init_app(app)完成初始化时,Flask-SQLAlchemy会自动基于这个URI底层调用create_engine创建Engine对象,并将其封装到Flask的上下文体系中,提供更贴合Web开发的ORM操作、自动上下文管理等功能(比如示例中的db.create_all()自动创建表,以及后续基于模型的CRUD操作)。你的Flask应用示例代码:
app.pyfrom project import create_app app = create_app() if __name__ == '__main__': app.run()init.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@server/db' db.init_app(app) with app.app_context(): from .views import views from .auth import auth from .models import users app.register_blueprint(views, url_prefix="/") app.register_blueprint(auth, url_prefix="/") db.create_all() return app
总结
两者并非完全独立的连接方式,而是封装层级不同:create_engine是数据库连接的底层实现,SQLALCHEMY_DATABASE_URI是Flask-SQLAlchemy提供的上层配置入口,最终依赖前者创建数据库连接引擎。前者适合直接执行原生SQL的场景,后者适合在Flask项目中使用ORM进行数据库操作,享受框架带来的集成便捷性和上下文管理能力。
内容的提问来源于stack exchange,提问作者Brandon

