SQLALCHEMY 基本用法

本文介绍ORM技术原理,演示Python的SQLAlchemy库如何简化数据库操作,实现对象与关系型数据库表之间的映射。

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

数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:

[

    ('1', 'Michael'),

    ('2', 'Bob'),

    ('3', 'Adam')

]

Python的DB-API返回的数据结构就是像上面这样表示的。

但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

class User(object):

    def __init__(self, id, name):

        self.id = id

        self.name = name

 

[

    User('1', 'Michael'),

    User('2', 'Bob'),

    User('3', 'Adam')

]

这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?

但是由谁来做这个转换呢?所以ORM框架应运而生。

在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。

首先通过easy_install或者pip安装SQLAlchemy:

$ easy_install sqlalchemy

然后,利用上次我们在MySQL的test数据库中创建的user表,用SQLAlchemy来试试:

第一步,导入SQLAlchemy,并初始化DBSession:

# 导入:

from sqlalchemy import Column, String, create_engine

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

 

# 创建对象的基类:

Base = declarative_base()

 

# 定义User对象:

class User(Base):

    # 表的名字:

    __tablename__ = 'user'

 

    # 表的结构:

    id = Column(String(20), primary_key=True)

    name = Column(String(20))

 

# 初始化数据库连接:

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')

# 创建DBSession类型:

DBSession = sessionmaker(bind=engine)

以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如School:

class School(Base):

    __tablename__ = 'school'

    id = ...

    name = ...

create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:

'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

你只需要根据需要替换掉用户名、口令等信息即可。

下面,我们看看如何向数据库表中添加一行记录。

由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

# 创建session对象:

session = DBSession()

# 创建新User对象:

new_user = User(id='5', name='Bob')

# 添加到session:

session.add(new_user)

# 提交即保存到数据库:

session.commit()

# 关闭session:

session.close()

可见,关键是获取session,然后把对象添加到session,最后提交并关闭。Session对象可视为当前数据库连接。

如何从数据库表中查询数据呢?有了ORM,查询出来的可以不再是tuple,而是User对象。SQLAlchemy提供的查询接口如下:

# 创建Session:

session = DBSession()

# 创建Query查询,filterwhere条件,最后调用one()返回唯一行,如果调用all()则返回所有行:

user = session.query(User).filter(User.id=='5').one()

# 打印类型和对象的name属性:

print 'type:', type(user)

print 'name:', user.name

# 关闭Session:

session.close()

运行结果如下:

type: <class '__main__.User'>

name: Bob

可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。

由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

class User(Base):

    __tablename__ = 'user'

 

    id = Column(String(20), primary_key=True)

    name = Column(String(20))

    # 一对多:

    books = relationship('Book')

 

class Book(Base):

    __tablename__ = 'book'

 

    id = Column(String(20), primary_key=True)

    name = Column(String(20))

    # “的一方的book表是通过外键关联到user表的:

    user_id = Column(String(20), ForeignKey('user.id'))

当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。

小结

ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。

正确使用ORM的前提是了解关系数据库的原理。

<think>好的,用户想了解SQLAlchemy基本用法。首先,我需要回忆一下SQLAlchemy的核心概念和常用功能。根据用户提供的引用内容,特别是引用[1]、[2]、[3]、[4],里面提到了Sqlalchemy的Query对象、数据类型、relationship、原生SQL使用,以及安装连接和ORM与Core API的区别。 用户可能刚接触SQLAlchemy,需要从基础开始讲解。首先应该介绍SQLAlchemy的两个主要组件:ORM和Core。然后按照步骤说明如何安装、连接数据库,接着是定义模型类,进行基本的CRUD操作。可能还需要提到使用原生SQL的方法,因为引用[1]和[4]提到了这点。 需要注意的是,用户提供的引用中有提到SQLAlchemy 2.0的变化,所以需要确保信息是最新的,特别是关于创建引擎和会话的部分。例如,在SQLAlchemy 2.0中,sessionmaker可能被async_sessionmaker取代,但用户可能还是使用同步方式,所以需要确认正确的方法。 另外,用户的问题是关于基本用法,所以不需要深入高级功能,但可以简要提及性能优化或常见问题,比如连接池配置或者事务处理。同时,根据引用[3],安装和连接是基础步骤,必须详细说明。 可能还需要区分ORM和Core API的使用场景,因为引用[2]和[3]提到了两者。但用户可能更关注ORM部分,因为这是更常见的用法。不过,根据引用[1],用户可能也需要知道如何使用原生SQL,所以应该包括这部分内容。 接下来,结构需要清晰,分步骤讲解:安装、连接、定义模型、创建会话、CRUD操作、事务处理,最后是原生SQL的使用。每个步骤给出示例代码,并确保代码符合SQLAlchemy 2.0的语法,比如使用`create_engine`的参数是否正确,是否使用了新的声明式基类方式(如`DeclarativeBase`)。 还需要检查引用中的信息是否一致,例如引用[4]提到使用`create_engine`时的URL格式,而引用[3]可能提到安装步骤,需要整合这些内容。同时,确保示例代码中的导入语句正确,比如从`sqlalchemy.orm`导入`Session`而不是`scoped_session`,除非需要更复杂的会话管理。 最后,生成相关问题时要覆盖用户可能进一步想知道的内容,比如性能优化、异步支持、模型关系处理等,参考引用中的内容,比如relationship的使用(引用[1])和Core API(引用[2])的区别。</think>### SQLAlchemy 基本用法教程 #### 一、核心组件与工作原理 SQLAlchemy 提供两个主要组件: 1. **ORM(对象关系映射)**:通过类与数据库表映射,实现面向对象操作 2. **Core(SQL表达式语言)**:直接使用SQL表达式进行数据库操作 推荐优先学习ORM模式,适合大多数应用场景[^3]。 #### 二、基础使用步骤 **1. 安装与连接数据库** ```python # 安装(支持Python3.8+) pip install sqlalchemy pymysql # 创建数据库引擎(以MySQL为例) from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://用户名:密码@IP:3306/数据库名?charset=utf8mb4', echo=True) # echo=True显示生成SQL ``` **2. 定义数据模型** ```python from sqlalchemy.orm import DeclarativeBase from sqlalchemy import Column, Integer, String class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(30)) age = Column(Integer) # 创建表结构 Base.metadata.create_all(engine) ``` **3. 创建会话工厂** ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) ``` **4. 基本CRUD操作** ```python # 新增数据 with Session() as session: new_user = User(name='张三', age=25) session.add(new_user) session.commit() # 查询数据 with Session() as session: users = session.query(User).filter(User.age > 20).all() for u in users: print(f"{u.id}: {u.name}") # 更新数据 with Session() as session: user = session.query(User).filter_by(name='张三').first() user.age = 26 session.commit() # 删除数据 with Session() as session: user = session.query(User).filter_by(name='张三').first() session.delete(user) session.commit() ``` #### 三、高级功能 1. **使用原生SQL** ```python with engine.connect() as conn: result = conn.execute(text("SELECT * FROM users WHERE age > :age"), {"age": 20}) for row in result: print(row) ``` 2. **关系映射** ```python class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) amount = Column(Integer) user = relationship("User", back_populates="orders") User.orders = relationship("Order", back_populates="user") ``` #### 四、事务管理 ```python with Session() as session: try: # 操作1 session.add(User(name='李四', age=30)) # 操作2 session.execute(text("UPDATE users SET age=age+1")) session.commit() except: session.rollback() raise ``` #### 五、最佳实践建议 1. 使用上下文管理器管理会话生命周期 2. 批量操作时使用`session.bulk_save_objects()`提升性能 3. 生产环境配置连接池参数: ```python engine = create_engine(url, pool_size=5, max_overflow=10, pool_timeout=30) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值