随笔 - 835  文章 - 1 评论 - 40 阅读 - 102万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

 

SQLAlchemy ORM框架能让你用Python的方式操作数据库,告别繁琐的SQL语句。

1.最简单的使用示例:

复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @mail    : lshan523@163.com
# @Time    : 2025/2/10 10:01
# @Author  : Sea
# @File    : SqlAlchemyTest.py# @Purpose :
# @history : 
# ****************************
# 连接数据库
# 参考文章: https://mp.weixin.qq.com/s?__biz=MzUxMzU4MjI1OQ==&mid=2247492924&idx=1&sn=bcb84b089ac7f86077196db67da4452b&chksm=f95050e0ce27d9f6f1949d69909a0a5b9e1d790b20e6a00d5a0332d4d6ee5fb8d64116e5c3f3&scene=27
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker

# ####### 1 创建数据库引擎  #####
engine = create_engine('sqlite:///xxx.db')
# mysql也可以这样连: MySQL要装pymysql  SQLite是Python
# engine = create_engine('mysql+pymysql://用户名:密码@localhost/数据库名')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()


# ####### 2 声明表  #####
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    age = Column(Integer)
    email = Column(String(120), unique=False)

    def __repr__(self):
        return f'<User {self.name,self.email}>'

# ######  3 创建所有的表  #####
Base.metadata.create_all(engine)


#  添加数据
new_user = User(name='小明2', age=18, email='xiaoming@qq.com')
session.add(new_user)
session.commit()

#  查询数据
users = session.query(User).all()
print(users)
# young_users = session.query(User).filter(User.age < 20).all()  # 带条件查询
# first_user = session.query(User).first()  # 查第一个




# 修改数据
user = session.query(User).filter_by(name='小明').first()
user.age = 19
session.commit()

# 删除数据
session.delete(user)
session.commit()


#  批处理
# 批量插入
users = [
    User(name=f'用户{i}', age=20+i)
    for i in range(100)
]
session.bulk_save_objects(users)
session.commit()

# 批量更新
session.query(User).filter(
    User.age < 20
).update({User.age: User.age + 1})
session.commit()
复制代码

 

 

2. 关系模型

复制代码
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Post(Base):
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key=True)
    title = Column(String(100))
    user_id = Column(Integer, ForeignKey('users.id'))
    # 建立关系
    author = relationship('User', backref='posts')

# 使用关系
new_post = Post(title='我的第一篇博客', author=user)
session.add(new_post)
session.commit()

# 查看用户的文章
user.posts  # 直接获取该用户的所有文章
复制代码

温馨提示:建立关系后,SQLAlchemy会自动处理连接查询,不用写join啦!

查询技巧:

复制代码
from sqlalchemy import desc, or_, and_

# 排序
users = session.query(User).order_by(desc(User.age)).all()

# 复杂条件
users = session.query(User).filter(
    or_(
        User.age < 20,
        User.name.like('小%')
    )
).all()

# 分页查询
page = 1
per_page = 10
users = session.query(User).offset(
    (page-1)*per_page
).limit(per_page).all()
复制代码

 

实用小技巧:

复制代码
# 防止重复添加
user = User(name='小红', age=20)
session.merge(user)  # merge代替add

# 回滚操作
try:
    session.add(user)
    session.commit()
except:
    session.rollback()
    raise
finally:
    session.close()

# 打印原生SQL语句
print(str(query.statement))
复制代码

 

posted on   lshan  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示