文章目录
前言
SQLALchemy对象关系映射器提供了一种方法,用于将用户定义的Python类和数据库表相关联,并将这些类的实例对象与其对应表中的行项关联。
DATABASE | Pyhton对象 | 关系 |
---|---|---|
table | class | 表映射为类 |
row | object | 行映射为实例 |
column | property | 字段映射为属性 |
ORM与构建ORM的SQLALchemy表达式语言形成对比。在SQL表达式语言教程中引入的SQL表达式语言提出了一种直接表示关系数据库的原始结构而没意见的系统,而ORM提供了一种高级和抽象的模式。
官方文档
https://docs.sqlalchemy.org
查看版本
import sqlalchemy
print(sqlalchemy.__version__)
SQLALchemy
1.引擎设置(Engine Configuration)
这Enigne是任何SQLALchemy应用程序的起点。他是实际数据库及其DBAPI的"home base",通过连接池和一个方言,传递给SQLALchemy应用程序,它描述了如何与特定类型的数据库/DBAPI组合记性通信。
一般的结构说明:
creat_engine:
from sqlalchemy import creat_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
数据库URL
该creat_engine()函数基于URL生成对象,这些URL遵循RFC-1738,通长可以包括用户名,密码,主机名,数据库名称以及用于其他设置的可选关键字参数。
# 典型形式
engine = creat_engine('dialect+driver://username:password@host:port/database')
# mysqlclient
engine = create_engine('mysql+mysqldb://username:password@host:port/database')
# PyMySQL
engine = create_engine('mysql+pymysql://username:password@host:port/database')
echo
creat_engine函数的另一个参数echo,该echo标志是设置SQLALchemy日志记录的快捷方式,他通过Python的标准日志记录模块logging完成。设置echo后,将看到生成的所有生成的SQL语句。
engine = create_engine('mysql+pymysql://username:password@host:port/database', echo=True)
注意:
engine对象是懒连接 (lazy connection):
第一次通过create_engine的返回对象engine并没有尝试去连接数据库,只有第一次要求他对数据库执行任务时才会发生这种情况。
2.声明映射类型
使用ORM时,配置过程首描述我们将要处理的数据库表,然后Python定义我们自己的类,这些类将映射到数据库中的这些表。
使用Declarative系统映射的类是根据基类定义的,该基类Base维护着相对于该基类建立的类和标的目录,这称为声明性基类。
基类的创建
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
实体类的创建
在基类的基础上,可以创建任意数量的映射类。
# 这里假设创建一个User类,
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(20), nullable=True)
age = Column(Integer, nullable=True)
def __repr__(self):
return "<{} {} {} {}>".format(
__class__.__name__, self.id, self.name, self.age
)
User类的__tablename__属性值为表名
User类的id, name, age属性通过Column类创建,对应着user表的属性值,注意至少有一个Column对象属于主键的一部分。
User是通过Base元类构建得到的类,里面定义了有关表的信息,称为表元数据,可以通过查看类属性__table__来看到这个对象:
>>> User.__table__
Table('user', MetaData(bind=None),
Column('id', Integer(), table=<user>, primary_key=True, nullable=False),
Column('name', String(length=20), table=<user>),
Column('age', Integer(), table=<user>), schema=None)
3.创建映射类的实例
创建映射类的实例对象
user1 = User(name="ben", age=20)
print(user1.id) # None
print(user1.name) # ben
print(user1.age) # 20
由于id字段是自增字段,而且构建实例的时候没有主动提供一个值,所以为None,SQLALchemy的检测通常在首次访问是为映射属性生成次默认值,对于那些分配了值的那些属性,检测系统会一直跟踪,一直到最红的insert语句使用发送到数据库。
注意: 实例化构造的类,实际上用到了Python 的描述器。
创建和删除表
可以使用SQLALchemy来创建和删除表
# 删除Base管理的所有表
Base.metadata.drop_all(engine)
# 创建继承自Base的所有表, 存在则跳过
Base.metadata.create_all(engine)
4.创建会话session
ORM对数据库的处理是session
在一个会话操作数据库,会话建立在连接上,连接被引擎engine管理。
当第一次使用数据库时,从引擎engine维护的连接池中获取一个连接使用。
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
# 实例化
session = Session()
注意:
session对象线程不安全。所以不同线程应该使用不同的session对象。
5.CURD操作
在CURD之前,我们务必要了解每个实体对象在被执行完操作之后的状态。
实体的状态
每一个实体都有一个状态属性_sa_instance_stat,器类型是sqlalchemy.orm.stat.InstanceState,可以使用sqlalchemy.inspect(entity)查看状态。
自定义一个查看状态的函数
def get_stat(instance, i):
stat:InstanceState = sqlalchemy.inspect(instance)