学习Flask:[特殊字符] Day 3:数据库集成

news/2025/2/27 5:45:10

学习目标:使用SQLAlchemy操作数据库

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    posts = db.relationship('Post', backref='author')

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

✅ 实践任务

  1. 初始化数据库flask shell中执行db.create_all()

  2. 实现用户注册功能(数据库存储)

  3. 创建一对多关系(用户-文章)

  4. 使用Flask-Migrate管理数据库迁移

要在 Flask 应用中初始化数据库并使用 flask shell 执行 db.create_all(),你可以按照以下步骤进行:

1. 安装 Flask-SQLAlchemy

如果你还没有安装 Flask-SQLAlchemy,可以使用以下命令进行安装:

pip install Flask-SQLAlchemy

2. 更新 app.py 文件

接下来,更新 app.py 文件以配置数据库并定义模型。

# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 数据库
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)
    password = db.Column(db.String(120), nullable=False)

@app.route('/')
def home():
    users = User.query.all()  # 从数据库中获取所有用户
    return render_template('home.html', users=users)

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        new_user = User(username=username, password=password)
        db.session.add(new_user)  # 添加新用户到数据库
        db.session.commit()  # 提交更改
        return redirect(url_for('home'))
    return render_template('register.html')

@app.route('/profile')
def profile():
    return render_template('profile.html')

@app.route('/api')
def api():
    return jsonify({"message": "这是API端点。"})

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

说明:

  • 在 app.py 中,配置了 SQLite 数据库,并定义了一个 User 模型,包含 id、username 和 password 字段。
  • 在 register 路由中,添加了新用户到数据库的逻辑。

3. 初始化数据库

现在,你可以使用 flask shell 来初始化数据库

  • 在终端中,导航到你的项目目录。
  • 启动 Flask shell:
flask shell
  • 在 Flask shell 中,执行以下命令以创建数据库和表:
from app import db
db.create_all()

4. 退出 Flask shell

完成后,你可以使用 exit() 命令退出 Flask shell。

运行应用:

确保你的项目结构正确,然后在终端中运行 python app.py。访问注册页面并注册用户,用户信息将被存储在 SQLite 数据库中。

要实现用户注册功能并将用户信息存储到数据库中,你可以按照以下步骤进行:

1. 更新 register 路由

在 app.py 中,确保 register 路由能够处理用户注册并将用户信息存储到数据库中。我们已经在之前的代码中添加了这个功能,但这里我们将确保它完整且安全。

2. 完整的 app.py 文件

以下是更新后的 app.py 文件,确保用户注册功能正常工作:

# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 数据库
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)
    password = db.Column(db.String(120), nullable=False)

@app.route('/')
def home():
    users = User.query.all()  # 从数据库中获取所有用户
    return render_template('home.html', users=users)

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        
        # 检查用户名是否已存在
        existing_user = User.query.filter_by(username=username).first()
        if existing_user:
            return "用户名已存在,请选择其他用户名。", 400
        
        new_user = User(username=username, password=password)
        db.session.add(new_user)  # 添加新用户到数据库
        db.session.commit()  # 提交更改
        return redirect(url_for('home'))  # 注册成功后重定向到首页
    
    return render_template('register.html')

@app.route('/profile')
def profile():
    return render_template('profile.html')

@app.route('/api')
def api():
    return jsonify({"message": "这是API端点。"})

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

说明:

  • 在 register 路由中,首先检查用户名是否已存在。如果存在,返回一个错误消息。
  • 如果用户名可用,则创建一个新的 User 实例,并将其添加到数据库中。
  • 使用 db.session.commit() 提交更改,将用户信息存储到数据库中。
  • 注册成功后,重定向到首页。

3. 运行应用

确保你的项目结构正确,然后在终端中运行 python app.py。访问注册页面,填写用户名和密码进行注册。注册成功后,用户信息将被存储在 SQLite 数据库中。

4. 验证用户注册

你可以在 flask shell 中验证用户是否成功注册:

  • 启动 Flask shell:
flask shell

查询用户:

from app import db, User
users = User.query.all()
for user in users:
    print(user.username)

这将打印出所有注册用户的用户名,确保用户注册功能正常工作。

要在 Flask 应用中创建一对多关系(例如,用户与文章之间的关系),你可以按照以下步骤进行:

1. 更新数据库模型

首先,我们需要在 app.py 中定义一个新的模型 Post,并在 User 模型中添加与 Post 的关系。

2. 更新 app.py 文件

以下是更新后的 app.py 文件,包含用户与文章之间的一对多关系:

# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 数据库
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)
    password = db.Column(db.String(120), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)  # 一对多关系

# 定义文章模型
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)  # 外键

@app.route('/')
def home():
    users = User.query.all()  # 从数据库中获取所有用户
    return render_template('home.html', users=users)

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        
        # 检查用户名是否已存在
        existing_user = User.query.filter_by(username=username).first()
        if existing_user:
            return "用户名已存在,请选择其他用户名。", 400
        
        new_user = User(username=username, password=password)
        db.session.add(new_user)  # 添加新用户到数据库
        db.session.commit()  # 提交更改
        return redirect(url_for('home'))  # 注册成功后重定向到首页
    
    return render_template('register.html')

@app.route('/profile')
def profile():
    return render_template('profile.html')

@app.route('/api')
def api():
    return jsonify({"message": "这是API端点。"})

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

说明:

  • 在 User 模型中,使用 db.relationship 定义与 Post 模型的一对多关系。backref='author' 允许我们通过 post.author 访问文章的作者。
  • 在 Post 模型中,定义了 title、content 和 user_id 字段,其中 user_id 是外键,指向 User 模型的 id 字段。

3. 初始化数据库

在进行模型更改后,你需要重新初始化数据库。使用 flask shell 执行以下命令:

flask shell

然后执行:

from app import db
db.create_all()

4. 创建文章的路由

接下来,我们可以添加一个路由来创建文章。以下是如何实现的:

@app.route('/post', methods=['GET', 'POST'])
def create_post():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        user_id = request.form['user_id']  # 假设你从表单中获取用户ID
        
        new_post = Post(title=title, content=content, user_id=user_id)
        db.session.add(new_post)
        db.session.commit()
        return redirect(url_for('home'))
    
    users = User.query.all()  # 获取所有用户以供选择
    return render_template('create_post.html', users=users)

5. 创建文章表单模板

在 templates 目录中创建一个新的 HTML 文件 create_post.html:

6. 运行应用

确保你的项目结构正确,然后在终端中运行 python app.py。访问 /post 路由以创建新文章,选择作者并填写文章标题和内容。文章将被存储在数据库中,并与相应的用户关联。

使用 Flask-Migrate 管理数据库迁移是一个很好的选择,它可以帮助你轻松地处理数据库模式的更改。以下是如何在你的 Flask 应用中设置和使用 Flask-Migrate 的步骤:

. 安装 Flask-Migrate

首先,确保你已经安装了 Flask-Migrate。你可以使用以下命令安装:

pip install Flask-Migrate

2. 更新 app.py 文件

接下来,更新 app.py 文件以集成 Flask-Migrate。以下是更新后的代码:

# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)

# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)  # 初始化 Flask-Migrate

# 定义用户模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)  # 一对多关系

# 定义文章模型
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)  # 外键

@app.route('/')
def home():
    users = User.query.all()  # 从数据库中获取所有用户
    return render_template('home.html', users=users)

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        
        # 检查用户名是否已存在
        existing_user = User.query.filter_by(username=username).first()
        if existing_user:
            return "用户名已存在,请选择其他用户名。", 400
        
        new_user = User(username=username, password=password)
        db.session.add(new_user)  # 添加新用户到数据库
        db.session.commit()  # 提交更改
        return redirect(url_for('home'))  # 注册成功后重定向到首页
    
    return render_template('register.html')

@app.route('/post', methods=['GET', 'POST'])
def create_post():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        user_id = request.form['user_id']  # 假设你从表单中获取用户ID
        
        new_post = Post(title=title, content=content, user_id=user_id)
        db.session.add(new_post)
        db.session.commit()
        return redirect(url_for('home'))
    
    users = User.query.all()  # 获取所有用户以供选择
    return render_template('create_post.html', users=users)

@app.route('/profile')
def profile():
    return render_template('profile.html')

@app.route('/api')
def api():
    return jsonify({"message": "这是API端点。"})

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

3. 初始化 Flask-Migrate

在项目目录中,使用以下命令初始化 Flask-Migrate:

flask db init

这将创建一个 migrations 目录,用于存储迁移脚本。

4. 创建迁移脚本

当你对模型进行更改时,可以使用以下命令创建迁移脚本:

flask db migrate -m "描述你的更改"

例如,如果你添加了一个新的字段到 Post 模型,你可以这样做:

flask db migrate -m "添加了新的字段到 Post 模型"

5. 应用迁移

要将迁移应用到数据库中,使用以下命令:

flask db upgrade

这将更新数据库以匹配当前的模型定义。

6. 查看迁移历史

你可以使用以下命令查看迁移历史:

flask db history

7. 回滚迁移

如果需要回滚到上一个迁移,可以使用以下命令:

flask db downgrade

8. 运行应用

确保你的项目结构正确,然后在终端中运行 python app.py。你现在可以使用 Flask-Migrate 来管理数据库迁移了。

总结

通过以上步骤,你已经成功集成了 Flask-Migrate,并可以轻松管理数据库的迁移。每当你对模型进行更改时,只需创建新的迁移脚本并应用它们即可。


http://www.niftyadmin.cn/n/5869550.html

相关文章

【论文解读】Kimi开源《Muon is Scalable for LLM Training》

Github:https://github.com/MoonshotAI/Moonlight HF:https://huggingface.co/moonshotai/Moonlight-16B-A3B Paper:https://github.com/MoonshotAI/Moonlight/blob/master/Moonlight.pdf 1. 摘要 背景与动机 随着大语言模型(LLM&…

JavaScript 系列之:Ajax、Promise、Axios

前言 同步:会阻塞。同步代码按照编写的顺序逐行依次执行,只有当前的任务完成后,才会执行下一个任务。 异步:异步代码不会阻塞后续代码的执行。当遇到异步操作时,JavaScript 会将该操作放入任务队列中,继续…

苹果折叠屏iPhone突破折痕难题 或将在2026年发布

(2025年2月26日)据供应链最新消息,苹果联合三星与美国安费诺公司,在折叠屏核心技术上取得重大突破,首款折叠屏iPhone样品已接近理想水平,最快将于2026年底上市。 屏幕采用三星供应的内折OLED柔性屏&#x…

OpenCV计算摄影学(5)处理一系列图像(例如视频帧)的非局部均值去噪的函数fastNlMeansDenoisingColoredMulti()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对用于彩色图像序列的 fastNlMeansDenoisingMulti 函数的修改。 cv::fastNlMeansDenoisingColoredMulti 函数是 OpenCV 中用于处理一系列图像&am…

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…

【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)

本文项目编号 T 219 ,文末自助获取源码 \color{red}{T219,文末自助获取源码} T219,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

博云先进算力管理平台AIOS已上线全尺寸DeepSeek系列模型

在异构基础设施上轻松运行全尺寸DeepSeek DeepSeek于2024年12月发布了包括 DeepSeek V3、R1、Janus Pro等多版本模型。V3版本适用于通用型自然语言处理任务,R1专注于复杂推理任务,而 Janus Pro 则擅长多模态理解与生成,可满足企业不同 AI 场…

建筑三维设计软件如何实现弯道超车?

三个问题 建筑三维设计软件属于工业设计软件的一种,在这个领域一直是国外公司垄断。前些年,在房地产高歌猛进的时代,很多公司也尝试投入到建筑三维设计软件的研发。随着房地产市场行业的下行,建筑三维设计软件的发展也受到了影响…