SQLAlchemy 2.0的简单使用教程

SQLAlchemy 2.0相比1.x进行了很大的更新,目前网上的教程不多,以下以链接mysql为例介绍一下基本的使用方法

环境及依赖

复制代码
Python:3.8
mysql:8.3
Flask:3.0.3
SQLAlchemy:2.0.37
PyMySQL:1.1.1

使用步骤

1、创建引擎,链接到mysql

python 复制代码
engine = create_engine('mysql+pymysql://{username}:{password}@{ip}:3306/{database_name}', echo=True)

以上的变量替换成自己的即可,比如你需要连接本地的test_db数据库,用户名为root,密码为123456,那么写法就是:

python 复制代码
engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test_db', echo=True)

echo参数的作用是开启sql输出,以便调试

2、打开数据库链接会话

python 复制代码
session = sessionmaker(engine)

3、保证线程安全

python 复制代码
db_session = scoped_session(session)

db_session对象在保证线程安全的同时也封装了常用的数据库操作,方便使用

4、获取基类

python 复制代码
Base = declarative_base()

5、创建数据库映射对象类

假设当前有一个数据库表名为user,表结构如下:

python 复制代码
class User(Base):
    __table__ = Table('user', Base.metadata, =engine)

autoload_with开启表结构的自动反射加载

测试

至此准备工作已经全完成,下面使用flask框架写一个简单的登录接口来测试

python 复制代码
import json

from flask import Flask, request
from sqlalchemy import create_engine, Table
from sqlalchemy.orm import sessionmaker, scoped_session, declarative_base

app = Flask(__name__)

# 创建一个引擎,链接到mysql
engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test_db', echo=True)
# 打开数据库链接会话
session = sessionmaker(engine)
# 保证线程安全
db_session = scoped_session(session)
# 获取基类
Base = declarative_base()


class User(Base):
    __table__ = Table('user', Base.metadata, autoload_with=engine)


@app.route('/', methods=['POST'])
def login():
    # 取到json请求数据
    request_data = json.loads(request.data)
    username = request_data['username']
    password = request_data['password']
    # 根据username、password查询数据库中是否有匹配对象
    result = db_session.query(User).filter_by(username=username, password=password).first()
    if result is None:
        return "登录失败"
    return "登录成功"


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

运行当前项目

log 复制代码
 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000

向接口发送请求

成功取到数据,登录成功:

log 复制代码
2025-01-31 23:03:09,852 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2025-01-31 23:03:09,855 INFO sqlalchemy.engine.Engine SELECT user.user_id AS user_user_id, user.username AS user_username, user.password AS user_password, user.nickname AS user_nickname, user.picture AS user_picture, user.create_time AS user_create_time, user.update_time AS user_update_time, user.job AS user_job 
FROM user 
WHERE user.username = %(username_1)s AND user.password = %(password_1)s 
 LIMIT %(param_1)s
2025-01-31 23:03:09,855 INFO sqlalchemy.engine.Engine [generated in 0.00022s] {'username_1': '黎震南', 'password_1': '62927', 'param_1': 1}
127.0.0.1 - - [31/Jan/2025 23:03:09] "POST / HTTP/1.1" 200 -
相关推荐
MYX_3098 分钟前
第四章 神经网络的学习
python·神经网络·学习
一匹电信狗26 分钟前
【MySQL】数据库基础
linux·运维·服务器·数据库·mysql·ubuntu·小程序
郝学胜-神的一滴1 小时前
Effective Python 第38条:简单的接口应该接受函数,而不是类的实例
开发语言·python·软件工程
海琴烟Sunshine1 小时前
leetcode 35.搜索插入的位置 python
python·算法·leetcode
海琴烟Sunshine2 小时前
leetcode 28. 找出字符串中第一个匹配项的下标 python
linux·python·leetcode
小蕾Java2 小时前
PyCharm快速上手指南,数据类型篇
ide·python·pycharm
飞翔的佩奇3 小时前
【完整源码+数据集+部署教程】 白血球图像分割系统: yolov8-seg-repvit
python·yolo·计算机视觉·数据集·yolo11·白血球图像分割系统·、yolov8
数据与人工智能律师3 小时前
数字人民币钱包抉择:匿名自由与实名安全的法律风险评估
大数据·人工智能·python·云计算·区块链
独行soc3 小时前
2025年渗透测试面试题总结-101(题目+回答)
网络·python·安全·web安全·adb·渗透测试·安全狮
好家伙VCC3 小时前
**全息显示技术的发散创新与深度探索**一、引言随着科技的飞速发展,全息显示技术已成为显示领域的一大研究热点。本文将带你
java·图像处理·python·科技·计算机视觉