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()

相关推荐
m0_640309301 小时前
如何在phpMyAdmin中生成XML格式导出_与其他企业系统的数据交互
jvm·数据库·python
xuhaoyu_cpp_java1 小时前
MySql学习(四)
数据库·经验分享·笔记·sql·学习·mysql
无限进步_2 小时前
【C++】寻找字符串中第一个只出现一次的字符
开发语言·c++·ide·windows·git·github·visual studio
2301_815279522 小时前
JavaScript中快速清空数组的多种方式及其性能差异
jvm·数据库·python
START_GAME2 小时前
SQL Server 还原 .bak 文件(SSMS 图形界面法)
运维·服务器·数据库
suliqiang2 小时前
MySQL数据库性能优化实战:系统性能提升100%的完整指南
数据库·mysql·性能优化
数厘2 小时前
2.20 sql基础聚合函数(COUNT、SUM、AVG、MAX、MIN)
数据库·sql·oracle
孬甭_2 小时前
字符函数及字符串函数
c语言·开发语言
苏渡苇2 小时前
Redis 版本演进、新特性与协议那些事儿
数据库·redis·缓存·开源协议·redis版本·redis新特性