Flask 中注册 SQLAlchemy

在 Flask 中注册 SQLAlchemy 有几种方式,最常见的是使用 Flask-SQLAlchemy 扩展。以下是详细步骤:

方法一:使用 Flask-SQLAlchemy(推荐)

1. 安装依赖

pip install Flask-SQLAlchemy

2. 基本注册方式

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 创建 Flask 应用
app = Flask(__name__)

# 配置数据库 URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 避免警告

# 创建 SQLAlchemy 实例并注册到应用
db = SQLAlchemy(app)

3. 使用应用工厂模式(更推荐)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 全局创建 SQLAlchemy 实例
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    
    # 配置
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    # 初始化 SQLAlchemy
    db.init_app(app)
    
    return app

# 在应用中使用
app = create_app()

# 定义模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

# 创建表
with app.app_context():
    db.create_all()

方法二:直接使用 SQLAlchemy(不推荐用于 Flask)

如果你不想使用 Flask-SQLAlchemy,也可以直接使用原生 SQLAlchemy:

from flask import Flask
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)

# 数据库配置
DATABASE_URL = 'sqlite:///example.db'

# 创建引擎
engine = create_engine(DATABASE_URL, echo=True)

# 创建会话
db_session = scoped_session(sessionmaker(bind=engine))

# 创建基类
Base = declarative_base()
Base.query = db_session.query_property()

@app.teardown_appcontext
def shutdown_session(exception=None):
    db_session.remove()

常用数据库 URI 示例

# SQLite(文件数据库)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///your_database.db'

# SQLite(内存数据库)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'

# MySQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'

# PostgreSQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost/db_name'

完整示例

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# 定义模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def to_dict(self):
        return {'id': self.id, 'username': self.username, 'email': self.email}

# 创建表
with app.app_context():
    db.create_all()

# 路由示例
@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    user = User(username=data['username'], email=data['email'])
    db.session.add(user)
    db.session.commit()
    return jsonify(user.to_dict()), 201

if __name__ == '__main__':
    app.run(debug=True)

注意事项

  1. SQLALCHEMY_TRACK_MODIFICATIONS: 设置为 False 可以避免内存开销和警告
  2. 应用上下文: 在应用工厂模式中,记得使用 app.app_context() 来执行数据库操作
  3. 数据库迁移: 建议配合 Flask-Migrate 使用来进行数据库迁移管理

推荐使用 方法一的应用工厂模式,这样代码结构更清晰,也便于测试和部署。

posted @ 2025-10-09 10:17  春水鸿鹄  阅读(12)  评论(0)    收藏  举报