一.简介
1.什么是ORM
- 对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;而且,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;同样,这些花费要比维护手写的方案要少;并且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
- 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
- 通俗来讲:**ORM,**即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
- 常见的ORM框架有:Hibernate、TopLink、Castor JDO、Apache OJB等。
- Java中ORM的原理: 先说ORM的实现原理,其实,要实现JavaBean的属性到数据库表的字段的映射,任何ORM框架不外乎是读某个配置文件把JavaBean的属 性和数据库表的字段自动关联起来,当从数据库Query时,自动把字段的值塞进JavaBean的对应属性里,当做INSERT或UPDATE时,自动把 JavaBean的属性值绑定到SQL语句中。
- SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。
2.SQLAlchemy与数据库关系图
二.基本操作
1.安装sqlalchemy
1).需要一台已安装MySQL数据库的机器
2).安装模块:pip install sqlalchemy
3).查看版本信息:
In [2]: import sqlalchemy
In [3]: sqlalchemy.__version__
Out[3]: '1.1.13'
4).连接数据库
在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session
#1)创建数据库引擎(连接数据库的过程)
#echo=True显示翻译好的SQL语句
from sqlalchemy.orm import Session
engine=sqlalchemy.create_engine("mysql://root:redhat@localhost/blog",
encoding='utf8', echo=True)
#2)建立缓存
from sqlalchemy.orm import Session,sessionmaker
session=sessionmaker(bind=engine)()
#3)创建数据库对象需要继承的基类,包含ORM映射中相关的类和表的信息
Base=declarative_base()
5). 创建映射(创建表)
一个映射对应一个python类,用来表示一个数据库表
class student_info(Base):
__tablename__='student_info'
id=Column(Integer,primary_key=True,autoincrement=True)
name=Column(String(20)) #Column表示构建一列数据
sex=Column(String(10))
if __name__ == '__main__':
#根据设置的信息创建数据库表(创建类:创建数据库表的过程)
Base.metadata.create_all(engine)
6).添加数据
#添加数据信息(实例化对象:添加一条数据/记录)
#insert into student_info(id,name,sex) values(%(id)s,%(name)s,%(sex)s)
stu1=student_info(id=2,name='westos1',sex='男')
stu2=student_info(id=3,name='westos3',sex='男')
stu3=student_info(id=4,name='westos4',sex='女')
添加stu对象,但是仍然没有提交到数据库
session.add_all([stu1,stu2,stu3])
#提交数据库
session.commit()
7).查询数据
#查询数据信息
print(session.query(student_info).all())
#根据筛选条件查询信息
print(session.query(student_info).filter_by(name='westos1').all())
print(session.query(student_info).filter_by(name='westos1').first())
print(session.query(student_info).filter_by(name='westoscdceedw').first())
8).删除数据
#删除数据
stu1=session.query(student_info).filter_by(name='westos1').first()
print("before delete:",stu1)
session.delete(stu1)
session.commit()