SQLAlchemy-ORM-Python

本文最后更新于:2020年9月27日 晚上

简介

SQLAlchemyPythonSQL``ORM工具
SQLAlchemy提供了一整套的持久化方式,提供高性能的数据库访问

特性

  • SQLAlchemy是一个强大的ORM,基于关系映射和核心Core制作
  • 可以通过操作对象模型,实现SQL的全部功能(包括连接查询,关联等)
  • 拥有一个灵活全面的系统,它可以快速的加载CollectionsObjects``Collections被缓存在一个Session中,可以一次性查询整个结果也可以单个来进行访问
  • SQLAlchemy``Core独立于ORM,它本身是一个完整的数据库抽象层,包括可扩展的基于python的SQL表达式语言、模式元数据、连接池、类型强制和自定义类型
  • 所有主键和外键约束都是复合的和自然的。你可以自由组合

链接

信息 链接
官网 https://www.sqlalchemy.org/
文档 http://www.sqlalchemy.org/docs/
github https://github.com/sqlalchemy/sqlalchemy

安装

1
pip install SQLAlchemy

验证安装

1
2
import sqlalchemy
print(sqlalchemy.__version__ )

如果看到了版本信息,说明已经安装成功

使用

创建连接

1
2
from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
  • echo参数
    这个参数用于设置SQLAlchemy日志的记录
    • True 显示输出,你会在控制台看到所有信息
    • False 这样做会减少输出信息的量
  • create_engine函数
    这个函数会返回一个Engine实例,它代表着数据库核心接口
    调用方法以后,引擎会建立与数据库的真实DBAPI连接。连接以后将其用于发出SQL

声明映射关系类

声明映射关系的类是根据Base类定义的
你可以通过declarative_base()函数来获取Base类

1
2
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

在有了Base类后你就可以声明映射关系的类了

1
2
3
4
5
6
7
8
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users' # 表名

id = Column(Integer, primary_key=True) # int类型主键 id
name = Column(String(50), comment='姓名') # String类型键name
fullname = Column(String(50), comment='全名') # String类型键fullname
nickname = Column(String(50), comment='昵称') # String类型键nickname

定义并不复杂,非常的简单明了,声明键类型与长度,添加注释
这个类虽然代表了映射关系,但它本身依旧可以定义和使用成员函数/属性

meatadata是一个包含了生成命令的注册机
你可以使用MetaData.create_all()来创建表

1
Base.metadata.create_all(engine)

创建映射关系实例

1
ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')

就算你没有声明构造函数,它也能根据传进来的参数对对应的项进行赋值

创建会话

使用create_engine()来创建一个Session类(需要传入一个engine)

1
2
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

这个定制的Session类将创建绑定到我们数据库的新Session对象
每当需要与数据库进行对话时,都可以实例化一个Session

插入/更新 数据

将实例用session.add()方法添加到Session中,以持久化

1
2
ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
session.add(ed_user)

在执行完这些代码以后,实例会被挂起,并没有发出SQL给数据
但如果你通过这个Session使用查询功能,这个实例会被找到
你可以通过add_all函数一次性添加多个实例

1
2
3
4
session.add_all([
User(name='wendy', fullname='Wendy Williams', nickname='windy'),
User(name='mary', fullname='Mary Contrary', nickname='mary'),
User(name='fred', fullname='Fred Flintstone', nickname='freddy')])

当你真的希望向数据库发送SQL提交事务时可以使用session.commit()

1
session.commit()

回滚

当发生一些冲突(如重复的主键之类的问题时)可以用回滚操作来让Session中的实例回归正常状态

1
session.rollback()

查询

使用session.query()方法,传入关系映射类作为参数来进行查询

1
2
for instance in session.query(User).order_by(User.id):
print(instance.name, instance.fullname)

可以指定返回的键

1
2
for row in session.query(User, User.name).all():
print(row.User, row.name)

all()方法会返回所有结果,在数据量较多时,一次性全载入内存可能会引起问题
类似的,first()方法会返回第一个结果
可以查询特定的键为某个值的数据

1
2
for row in session.query(User.name.label('name_label')).all():
... print(row.name_label)

结合order_by与切片功能来使用

1
2
for u in session.query(User).order_by(User.id)[1:3]:
print(u)

过滤结果

1
2
for name, in session.query(User.name).filter_by(fullname='Ed Jones'):
print(name)

后续:https://docs.sqlalchemy.org/en/13/orm/tutorial.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!