SQLAlchemy简介

它是一个ORM(Object-Relational Mapping)框架,是python最好的ORM工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型

提示一点:ORM并非是非用不可,但是,为了代码的健壮性,我们最好还是使用ORM,一方面,为了提高开发效率,另一方面,为了使别人能够看懂代码。

安装

安装sqlalchemy:

pip install sqlalchemy

连接数据库

所有的关系型数据库,都可以通过这样连接

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

我们就拿mysql打个比方:

需要安装pymysql,因为引擎基于pymysql

pip install pymysql

# 首先,导包
from sqlalchemy import create_engine
# 创建数据库连接
connect = create_engine('mysql+pymysql://root:mySQL@localhost:3306/test01')
# 可以顺便指定一下编码方式
# create_engine('mysql+pymysql://root:mySQL@localhost:3306/test01?charset=utf8')

这样,我们就能连接上数据库了

描述表结构(模型)

要使用 ORM, 我们需要将数据表的结构用 ORM 的语言描述出来。SQLAlchmey 提供了一套 Declarative 系统来完成这个任务。我们以创建一个 user 表为例,看看它是怎么用 SQLAlchemy 的语言来描述的

from sqlalchemy.ext.declarative import declarative_base

ModelBase = declarative_base() #<-元类

class User(ModelBase):
    # 定义表名
    __tablename__ = "user"
    # 声明字段
    id = Column(Integer, primary_key=True)
    username = Column(String(length=255))
    password = Column(String(length=255))

这个模型,是对数据表结构的映射,无论是进行迁移文件还是操作数据库,都需要使用到它

一对多关系

一对多,也就是我们所谓的外键,假如,有个user表,要求每个user都要有一个角色,我们就需要另外建立一张角色表,来通过外键连接角色表,用来实现关联,一个角色可以被多个user关联,一个user只能有一个角色,这,就是一对多的关系

class User(ModelBase):
    # 定义表名
    __tablename__ = "user"
    # 声明字段
    id = Column(Integer, primary_key=True)
    username = Column(String(length=255))
    password = Column(String(length=255))
    role = Column(Integer,ForeignKey('role.id'))
    
class Role(ModelBase):
    __tablename__ = 'role'
    id = Column(Integer, primary_key=True)
    name = Column(String(length=255))
    isnn = relationship('User')

可以看到,我们定义了ForeignKey来指定关联哪张表,连接哪个字段

而“一”这里,提供了一个relationship方法来表明两个模型中的关系

而relationship有一个backref,来指定反向访问的属性名称,在我们的这个例子中,就是用来反向访问,都有哪些用户是这个角色


添加数据(Create)

我们依赖上方的代码来进行添加

⚠!!!在SQLAlchemy中,CRUD都是通过会话(session)进行的,所以我们必须要先创建会话,每一个SessionLocal实例就是一个数据库session

from sqlalchemy.orm import sessionmaker
# 创建DBSession类型
# flush()是指发送数据库语句到数据库,但数据库不一定执行写入磁盘;commit()是指提交事务,将变更保存到数据库文件
DBSession = sessionmaker(bind=connect,autoflush=False, autocommit=False, expire_on_commit=True)
# 创建session对象
session = DBSession()
# 创建新User对象(我们要添加的数据)
new_user = User(id=1,username='Bob',password='123')
# 添加到session
session.add(new_user)
# 提交即保存到数据库
session.commit()
# 关闭session
session.close()

ok,执行一下,可以看到我们的数据库中已经有了这条数据

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

查找数据(Retrieve)

重新得到数据

user = session.query(User).filter(User.id==5).one()
print(type(user))
print('name',user.username)

这只是查找第一条

如果要获取多条,那么就可以将one换成all

user = session.query(User).filter(User.id==5).all()
print(type(user))
for i in user:
    print(i.username)

注意,因为获取多条,他的类型是列表,所以,我们需要处理一下


更新数据(Update)

首先呢,我们需要找出需要修改的数据,然后直接进行update修改

session.query(User).filter(User.id==1).update({'username':'haoye'{)
session.commit()

删除数据(delete)

操作和update一致,只是最后换成dalete

session.query(User).filter(User.id==1).delete()
session.commit()

总结:最为简单的CRUD操作并没有什么难度,只是需要注意的是,为了节约内存资源,最好是做完操作之后,将session进行关闭

如果我们要学习除了django之外的web框架,几乎都离不开sqlachemy,所以,将sqlachemy学好收益还是非常大的