ORM:Object Relation Mapping
程序中的对象Object和数据库中的表(关系Relation)之间的对应(Mappgin映射)关系;对这样的关系的操作管理过程就是ORM编程
1.ORM编程的核心步骤
ORM操作核心:数据对象的增删改查
2.ORM操作和tornado的关系
tornado曾经支持简单的orm操作!就是可以通过自定义sql语句的方式,来完成数据对象的拆分之后进行增删改查操作[并不是面向对象的]torndb分家了!作为了一个独立的模块进行处理tornado不在有内置的ORM支持!
tornado在实际使用时,我们都人为它并没有支持内置的ORM操作,而是需要和第三方模块结合起来完成数据模型对象的ORM操作{ pymysql, mysqldb ,torndb, ..}[这样的操作方式,一般都是直接操作sql语句]
比较常用的操作手段:使用pymysql/torndb/sqlalchemy
5. sqlalchemy核心操作
安装~检测安装是否成功
pip install sqlalchemy
easy_install sqlalchemy
查看版本
python
>>> import sqlalchemy
>>> print(sqlalchemy.__version__)
6. sqlalchemy的使用
ORM操作的核心,就是将程序中的对象要在数据库中进行增删改查操作
1.连接指定数据库
建立指定数据库的连接引擎engine~
获取和指定数据库之间的连接对象_会话session
from sqlalchemy import create_engine # 创建引擎对象的模块
from sqlalchemy.orm import sessionmaker # 创建和数据库连接会话
engine = create_engine(..)# 创建引擎对象
Session = sessionmaker(bind=engine) # 创建会话类型
session = Session() # 获取一个连接会话
如果创建会话的时候还没有创建引擎对象
Session = sessionmaker()# 创建一个会话类型
Session.configur(bind=engine)# 将一个连接引擎注册给这个会话
session = Session() # 得到具体的包含连接引擎的会话
就可以通过一个连接会话进行数据对象的增删改查操作
PS注意:sqlalchemy默认底层使用mysqldb完成和数据库的连接
但是~mysqldb不支持最新版本的python和mysql数据库的连接,我们一般使用Pymysql进行替代
2.操作程序中的数据模型创建的对象
定义数据模型类
创建类型的对象
保存对象到数据库/修改对象数据到数据库/从数据库中删除某个对象
需要让自定义类型,继承sqlalchemy内置的某个类型[思考]
让自定义类型的属性,通过sqlalchemy封装的函数进行创建[思考]
自定义类型和数据库中表的关联关系,通过指定的字段进行确定[思考]
sqlalchemy内建了一个构建基础类的函数,通过这个函数可以创建一个模型的基础类
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
sqlalchemy内建了一部分用于创建字段属性的函数,可以给自定义类型直接定义属性,如Column用来定义属性,String\Integer\Float等等用来定义属性的类型;需要注意的是:一定要确保你的类型中指定了使用哪个属性作为主键!
定义数据模型类:
自己定义的数据模型类~要接受sqlalchemy的支持
需要让自定义类型,继承sqlalchemy内置的某个类型
让自定义类型的属性,通过sqlalchemy封装的函数进行创建
自定义类型和数据库中表的关联关系,通过指定的字段进行确定
sqlalchemy内建了一个构建基础类的函数,通过这个函数可以创建一个模型的基础类
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
sqlalchemy内建了一部分用于创建字段属性的函数,可以给自定义类型直接定义属性,如Column用来定义属性,String\Integer\Float等等用来定义属性的类型;需要注意的是:一定要确保你的类型中指定了使用哪个属性作为主键!
from sqlalchemy import Column, String, Integer
class Person(Base):
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
sqlalchemy不会自动关联数据模型和数据库中表的关系,需要在代码中直接指定当前类型和哪个数据库之间有关联关系,通过__tablename__指定
class Person(Base):
__tablename__ = “person” # 指定关联表
..
# 创建一个指定数据类型的对象
和常规对象的创建方式一致,通过关键字参数直接给属性赋值即可
此时创建的对象只是存储在内存中的对象~没有id编号的对象~暂时不受sqlalchemy的管理~临时对象
person = Person(name=’tom’, age=12)
# 同步对象数据到数据库,此时的同步,在数据库中并没有数据~而是临时存储在会话中的一个对象~缓存对象
session.add(p)
# 通过事务提交的方式,将缓存对象可以存储到数据库中,此时的对象就是持久对象
session.commit()
# 通过类型的__table__属性查看它的数据库表元数据
# 通过Base.metadata属性封装的函数完成数据库之间的数据同步操作
# print(Person.__table__)
# Base.metadata.create_all() # 将所有salalchemy管理的对象同步到数据库中产生对应的数据表
# 1. 程序中直接创建的对象,是保存并运行在内存中的~一旦程序结束,内存中的数据会清空
# 临时状态(游离状态):程序中直接创建的对象,临时对象
# 特点:程序中有数据,缓存中无数据,数据库中无数据
p = Person(name="jerry", age=12)
print(p, p.id, p.name, p.age)
# 2. 程序中的对象,可以通过连接会话session的add()函数,将对象交给sqlalchemy进行管理
# 缓存状态(托管状态):对象只是存在于连接会话缓存中,数据库中并没有相关数据,缓存对象
# 特点:程序中有数据,缓存中有数据,数据库中无数据
session.add(p)
# 3. 缓存中的数据,可以通过连接会话session的commit()函数,将缓存数据提交给数据库进行持久化保存
# 持久状态(持久persistent状态):对象在程序中存在,在数据库中有对应的记录
# 特点:程序中有数据{id}, 缓存中有数据, 数据库中有数据
session.commit()
print(p.id, p.name, p.age)
# 修改操作
# 一旦对缓存状态的对象进行修改,此时缓存对象和数据库中的数据不一致~
# 就会形成脏数据,脏数据并不是不可取的,更新操作就是将这样的数据从缓存同步到数据库(commit)
p.name = "shuke"
# 可以通过session.dirty来查询缓存中的脏数据
session.commit()
# 删除操作
session.delete(p)# 直接删除一个缓存的数据[脏数据],通过commit()提交到数据库
session.commit()
# 注意删除的只能是持久对象
#p2 = Person(id=1)
#session.delete(p2)# 抛出异常~不能删除,因为p2不是持久对象is not persisted