Flask与PostgreSQL交互教程

目录

    • [1. 项目结构](#1. 项目结构)
    • [2. 环境准备](#2. 环境准备)
      • [2.1 安装依赖](#2.1 安装依赖)
      • [2.2 使用Docker启动PostgreSQL](#2.2 使用Docker启动PostgreSQL)
    • [3. 数据库配置](#3. 数据库配置)
      • [3.1 环境变量配置](#3.1 环境变量配置)
      • [3.2 数据库连接配置](#3.2 数据库连接配置)
    • [4. 定义数据库模型](#4. 定义数据库模型)
    • [5. 实现API接口](#5. 实现API接口)
      • [5.1 创建用户](#5.1 创建用户)
      • [5.2 获取所有用户](#5.2 获取所有用户)
      • [5.3 获取单个用户](#5.3 获取单个用户)
      • [5.4 更新用户](#5.4 更新用户)
      • [5.5 删除用户](#5.5 删除用户)
    • [6. 运行应用](#6. 运行应用)
    • [7. API测试](#7. API测试)
      • [7.1 创建用户](#7.1 创建用户)
      • [7.2 获取所有用户](#7.2 获取所有用户)
      • [7.3 获取单个用户](#7.3 获取单个用户)
      • [7.4 更新用户](#7.4 更新用户)
      • [7.5 删除用户](#7.5 删除用户)

本教程将指导你如何使用Flask框架与PostgreSQL数据库进行交互,实现一个简单的用户管理API。

1. 项目结构

首先,让我们了解项目的基本结构:

复制代码
├── .env                  # 环境变量配置
├── app.py                # Flask应用主文件
├── docker-compose.yml    # Docker配置文件
├── models.py             # 数据库模型定义
└── requirements.txt      # 项目依赖

2. 环境准备

2.1 安装依赖

首先,我们需要安装必要的依赖包:

bash 复制代码
pip install -r requirements.txt

依赖包包括:

  • Flask: Web框架
  • psycopg2-binary: PostgreSQL的Python驱动
  • flask-sqlalchemy: Flask的ORM扩展
  • python-dotenv: 环境变量管理

2.2 使用Docker启动PostgreSQL

我们使用Docker Compose来管理PostgreSQL数据库。以下是docker-compose.yml的配置:

yaml 复制代码
services:
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_DB=postgres
    ports:
      - "5432:5432"

volumes:
  postgres_data:

启动PostgreSQL容器:

bash 复制代码
docker-compose up -d

这将启动一个PostgreSQL 13的实例,并将其端口映射到本地的5432端口。

3. 数据库配置

3.1 环境变量配置

.env文件中,我们定义了数据库连接和Flask应用的环境变量:

复制代码
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres

3.2 数据库连接配置

app.py中,我们使用以下代码配置数据库连接:

python 复制代码
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

app = Flask(__name__)

# 配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 初始化数据库
db.init_app(app)

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

4. 定义数据库模型

models.py中,我们定义了一个简单的User模型:

python 复制代码
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'users'

    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)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return f'<User {self.username}>'
    
    def to_dict(self):
        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

这个模型定义了用户表的结构,包括id、用户名、邮箱和创建时间等字段。to_dict()方法用于将用户对象转换为字典,方便JSON序列化。

5. 实现API接口

app.py中,我们实现了一组RESTful API接口,用于对用户进行CRUD操作:

5.1 创建用户

python 复制代码
@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    
    if not data or not data.get('username') or not data.get('email'):
        return jsonify({'error': 'Invalid data'}), 400
    
    try:
        user = User(username=data['username'], email=data['email'])
        db.session.add(user)
        db.session.commit()
        return jsonify({'message': 'User created successfully', 'user': user.to_dict()}), 201
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500

5.2 获取所有用户

python 复制代码
@app.route('/users', methods=['GET'])
def get_users():
    try:
        users = User.query.all()
        return jsonify({'users': [user.to_dict() for user in users]})
    except Exception as e:
        return jsonify({'error': str(e)}), 500

5.3 获取单个用户

python 复制代码
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    try:
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'User not found'}), 404
        return jsonify({'user': user.to_dict()})
    except Exception as e:
        return jsonify({'error': str(e)}), 500

5.4 更新用户

python 复制代码
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    try:
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'User not found'}), 404
        
        data = request.get_json()
        if data.get('username'):
            user.username = data['username']
        if data.get('email'):
            user.email = data['email']
        
        db.session.commit()
        return jsonify({'message': 'User updated successfully', 'user': user.to_dict()})
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500

5.5 删除用户

python 复制代码
@app.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
    try:
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'User not found'}), 404
        
        db.session.delete(user)
        db.session.commit()
        return jsonify({'message': 'User deleted successfully'})
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500

6. 运行应用

启动Flask应用:

bash 复制代码
python app.py

或者使用Flask命令:

bash 复制代码
flask run --host=0.0.0.0

应用将在http://localhost:5000上运行。

或者用uv:

7. API测试

你可以使用工具如Postman或curl来测试API:

7.1 创建用户

bash 复制代码
curl -X POST http://localhost:5000/users -H "Content-Type: application/json" -d '{"username":"test_user","email":"test@example.com"}'

7.2 获取所有用户

bash 复制代码
curl http://localhost:5000/users

7.3 获取单个用户

bash 复制代码
curl http://localhost:5000/users/1

7.4 更新用户

bash 复制代码
curl -X PUT http://localhost:5000/users/1 -H "Content-Type: application/json" -d '{"username":"updated_user"}'

7.5 删除用户

bash 复制代码
curl -X DELETE http://localhost:5000/users/1
相关推荐
ldj20207 小时前
2025 Centos 安装PostgreSQL
linux·postgresql·centos
AxureMost11 小时前
Axure常用交互功能案例-免费
交互·axure·photoshop
喜欢吃豆14 小时前
目前最火的agent方向-A2A快速实战构建(二): AutoGen模型集成指南:从OpenAI到本地部署的全场景LLM解决方案
后端·python·深度学习·flask·大模型
亚力山大抵1 天前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask
大美B端工场-B端系统美颜师1 天前
多模态数据融合预警:从IoT传感器到卫星监测的可视化方案升级
物联网·交互·数据预警
小彭努力中1 天前
141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
前端·javascript·vue.js·交互
梓贤Vigo1 天前
【Axure高保真原型】动态打字输入效果
交互·产品经理·axure·原型
梓贤Vigo1 天前
【Axure视频教程】大小图轮播
交互·产品经理·axure·原型·中继器
hi星尘1 天前
深度解析:Java内部类与外部类的交互机制
java·开发语言·交互
坤坤不爱吃鱼1 天前
【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案
mysql·postgresql·oracle