python sqlalchemy更简单的用法

本文介绍使用Python的SQLAlchemy库通过automap_base机制自动映射已有数据库表的方法,并演示了如何进行数据查询、修改及批量插入等常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前期我发表过一篇文章:python sqlalchemy的简单用法,后来又看了很多sqlchemy的新版本文档,发现自己那篇文章里讲的方法很多代码都是画蛇添足,还有更简单的用法。

我们应用的场景依然是你的数据库表是已经建立好的,只是想用python操作数据库(增、删、查、改等),但不涉及建表、主外键关系等内容(因为这些内容一般都是直接用SQL)。

类的映射

比如我用来存储用户信息的sqlite数据库 (test.db) 结构是这样的:

create table if not exists users (
    id integer primary key,
    name varchar(20),
    password varchar(20)
);

 
sqlalchemy 0.9.1 之后增加了一种automap_base的机制,可以使现成的数据库中的数据结 构反射到类上。用来访问上述数据库中的表只需要简单几句就可以完成映射:

 
import sqlalchemy
from sqlalchemy.orm import Session
from sqlalchemy.ext.automap import automap_base
if __name__ == "__main__":
    engine_str = 'sqlite:///:test.db'
    engine = sqlalchemy.create_engine(engine_str)
    session = Session(engine)
    # 下面这两句话就完成了ORM映射 Base.classes.XXXX即为映射的类
    # Base.metadata.tables['XXX']即为相应的表
    Base = automap_base()
    Base.prepare(engine, reflect = True)
    # 查询操作
    result = session.query(Base.classes.users).all()
    # 插入操作
    item = Base.classes.users(name='lxq', password='1234')
    session.add(item)
    session.commit()
    
    session.close()


简单定义了两个类之后,不用关心数据表的内部实现,sqlalchemy会实现自动的映射,随 后手册上的很多操作都可以正常使用了。

数据修改

ORM系统对数据库中访问到的每一行数据会映射为一个唯一的Table对象,因此,当需要对 数据修改的时候,找到这行数据然后直接改其元素然后commit即可。
  
ed_user = session.query(User).filter_by(name='ed').first()
ed_user.name = 'love'
session.commit()

批量插入

利用单纯的ORM方式进行大批量的插入数据,由于是调用多条INSERT语句,因此效率十分低下,session.add_all函数实际上也是调用了多条INSERT语句,如果想批量插入数据,可以进行如下处理:
  
engine.execute(User.__table__.insert(), 
    [{'name':'hello', 'password':'1234'},
    {'name':'hello2', 'password':'1234'}])

MISC-lazy connecting
create_engine 按照手册上的说法是lazy_connecting,当你在create_engine的时候并不会真正的建立数据库连接,而当第一次进行数据库相关操作的时候才会真正建立连接。
### 使用SQLAlchemyPython中进行数据库操作 #### 定义数据库连接 为了使用SQLAlchemy执行任何类型的数据库操作,首先需要建立与目标数据库的连接。这通常涉及创建一个`Engine`实例,该实例负责管理底层数据库连接池[^3]。 ```python from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool username = 'root' password = 'root' host = 'localhost' port = '3306' database = 'test' engine = create_engine( f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}', poolclass=QueuePool, pool_size=10, pool_timeout=30 ) ``` #### 声明映射类 一旦建立了数据库连接,下一步就是声明映射类——即那些代表数据库表格结构的Python类。这些类继承自`Base`基类,并利用装饰器或属性来描述表名以及字段名称和类型[^2]。 ```python from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) fullname = Column(String(50)) nickname = Column(String(50)) def __repr__(self): return "<User(name='%s', fullname='%s', nickname='%s')>" % ( self.name, self.fullname, self.nickname) ``` #### 创建会话 要对数据库执行CRUD(创建、读取、新、删除)操作,则需借助Session对象。此对象充当工作单元模式的角色,在其中可以添加新记录、修改现有条目或是检索数据。 ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() ``` #### 执行基本的操作 - **插入**: 可以通过实例化映射类并将其实例加入当前会话来进行新增操作。 ```python new_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname') session.add(new_user) session.commit() # 提交事务保存改 ``` - **查询**: 查询可以通过构建Query对象完成,支持多种过滤条件组合方式获取所需的数据集。 ```python users = session.query(User).filter_by(name='ed').all() print(users) ``` - **新**: 新特定记录可通过先定位再改变其属性值的方法实现。 ```python user_to_update = session.query(User).get(1) # 获取ID为1的用户 if user_to_update: user_to_update.name = "updated_name" session.commit() ``` - **删除**: 删除指定实体只需调用delete方法即可移除对应的数据库行。 ```python user_to_delete = session.query(User).get(1) if user_to_delete: session.delete(user_to_delete) session.commit() ``` SQLAlchemy不仅简化了数据库编程接口,还提供了强大的功能集合,使得开发者能够加专注于业务逻辑而非繁琐的SQL语法细节[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值