SQLAlchemy学习记录

目录

一、SQLAlchemy介绍

二、了解:数据库连接地址

三、了解:引擎

第一步:装驱动(二选一)

[第二步:装 SQLAlchemy](#第二步:装 SQLAlchemy)

可直接用一行命令:

注意:安装在虚拟环境里

四、了解:会话

五、了解:模型

六、实操

[1.创建库 + 表](#1.创建库 + 表)

2.示例代码

3.解析:

七、总结:


参考资料:sqlaichemy介绍

一、SQLAlchemy介绍

SQLAlchemy是Python生态系统中最流行的ORM。

作用:让你不用写 SQL,用 Python 代码操作数据库

二、了解:数据库连接地址

一、数据库连接地址:URL通常可以包括用户名、密码、主机名、数据库名以及用于其他配置的可选关键字参数。主题格式为:

复制代码
dialect+driver://username:password@host:port/database

三、了解:引擎

引擎:引擎是 SQLAlchemy 与数据库进行连接的核心组件。它负责管理数据库连接池,处理与数据库的实际通信。创建引擎时,需要指定数据库的类型和连接字符串。

链接mysql数据库的引擎创建方式:

第一步:装驱动(二选一)

使用驱动,首先需要安装对应的驱动

复制代码
pip install mysqlclient
#或者
pip install pymysql

第二步:装 SQLAlchemy

复制代码
pip install sqlalchemy

可直接用一行命令:

复制代码
pip install pymysql sqlalchemy

注意:安装在虚拟环境里

原因:

  • 版本冲突:不同项目需要依赖不同版本的库,比如 A 项目要用 SQLAlchemy 1.4,B 项目要用 2.0,全局安装会互相覆盖。

  • 环境混乱:时间久了,全局环境里会堆积几百个你用不到的包,导致系统臃肿甚至崩溃。

四、了解:会话

会话:会话是我们与数据库进行交互的接口。通过会话,我们可以执行查询、插入、更新和删除等操作。一个会话可以管理多个数据库事务。创建会话通常使用 sessionmaker 来绑定到一个引擎上

复制代码
# 1. 创建引擎(建立连接)
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/testdb")

# 2. 创建会话工厂(绑定引擎)
Session = sessionmaker(bind=engine)

# 3. 创建会话(真正用来操作)
db = Session()

五、了解:模型

模型(Model) :在 ORM 中,模型是表示数据库表的 Python 类。每个模型类的属性对应表中的列,并且可以定义关系来表示表与表之间的关联。sqlalchemy.ext.declarative.declarative_base() 创建的基类

六、实操

1.创建库 + 表

复制代码
-- 创建数据库
CREATE DATABASE IF NOT EXISTS tree_hole DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE tree_hole;

-- 创建用户表
DROP TABLE IF EXISTS user;
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    content TEXT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建树洞消息表
DROP TABLE IF EXISTS message;
CREATE TABLE message (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    content TEXT NOT NULL,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

2.示例代码

python 复制代码
from sqlalchemy import create_engine,Column,Integer,String,Text,DateTime
from sqlalchemy.orm import sessionmaker,relationship
from datetime import datetime
from sqlalchemy.ext.declarative import declarative_base
DB_URL="mysql+pymysql://root:0123456@localhost:3306/tree_hole"
#创建数据库引擎
engine=create_engine(
    DB_URL,
    echo=False,
    pool_recycle=3600
)
#创建会话
SessionLocal=sessionmaker(autocommit=False,autoflush=False,bind=engine)

#创建唯一的基础父类(基类)
Base=declarative_base()

# 定义数据表
class User(Base):
    _tablename_="user"

    id=Column(Integer,primary_key=True,autoincrement=True)
    username=Column(String(50),unique=True,nullable=False)
    content=Column(Text,nullable=True)
    create_time=Column(DateTime,default=datetime.now)

    #如果表不存在,建表

    # 获取会话
    def get_db():
        db=SessionLocal()
        try:
            yield db
        finally:
            db.close()
# CURD
if __name__ =="__main__":
    # 获取数据库会话
    db=next(get_db())

# 新增
new_user=User(
    username="张三",
    content="这是一条用户分享的提示词"
)
db.add(new_user)
db.commit()#提交
db.refresh(new_user)#刷新获取最新数据
print("新增成功:",new_user.id)

# 查询
user_list=db.query(User).all()
print("总条数",len(user_list))

# 条件查询
user_list=db.query(User).filter(User.username=="张三").all()

# 排序+分页
user_list=db.query(User).order_by(User.id.desc()).limit(10).offset(0).all()

# 修改
user_list=db.query(User).filter(User.id==1).first()
if user:
    user.content="修改后的内容"
    db.commit()

# 删除
user=db.query(User).filter(User.id==1).first()
if User:
    db.delete(user)
    db.commit()

#关闭会话
db.close

3.解析:

1.echo=False = 让控制台干净、不刷屏

2.pool_recycle=3600 = 防止连接超时报错

3.Base=declarative_base()

  • declarative_base() → 生成模型父类
  • Base → 保存这个唯一父类
  • 所有表模型必须继承 Base,才能被 SQLAlchemy 识别

七、总结:

引擎:建立连接

engine = create_engine(数据库URL)

会话工厂:绑定引擎

Session = sessionmaker(bind=engine)

会话:真正操作数据库

db = Session()

增

db.add(obj)

查

db.query(Model).filter().first() / all() # 改 obj.field = xxx

删

db.delete(obj)

提交

db.commit()

相关推荐
夏幻灵4 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码4 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
IvorySQL5 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔5 小时前
SQL 脚本的导入顺序
数据库·sql
bkspiderx6 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用6 小时前
Spring对IoC的实现
数据库·spring
程序员老陆6 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光6 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园6 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西7 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis