Python学习笔记(二十五)基于Sqlalchemy的ORM框架

时间:2022-08-11 13:11:09

参考资料:
https://www.cnblogs.com/llkingangle/p/7189622.html
https://www.cnblogs.com/caicairui/p/7821601.html
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000
1、 概述。
      对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
    当开发一个应用程序的时候,如果不使用ORM,可能会写不少数据访问层(DAL)的代码,用来从数据库保存、删除、读取对象信息等等,而这些代码写起来总是重复的。
     ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
       ORM技术特点:
   (1)提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
    (2)ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样与数据库进行交互。
2、在Python中,最有名的ORM框架是SQLAlchemy。
       在使用之前,可通过pip install sqlalchemy命令完成该模块的安装。
      仍然以MySQL数据库为例,编码之前需要在数据库中建立下面的表:
create table user(id varchar(20) not null, name varchar(20) not null, primary key (id));
create table book(id varchar(20) not null, name varchar(20) not null, user_id varchar(20), primary key(id));

 下面是我的学习代码:

from sqlalchemy import Column, String, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

#动态定义用于将表实体化的基类
Base = declarative_base()

#用于将表user实体化的类
class User(Base):
    __tablename__ = 'user'

    id = Column(String(20), primary_key = True)
    name = Column(String(20))
    books = relationship('Book')

#用于将表book实体化的类
class Book(Base):
    __tablename__ = 'book'

    id = Column(String(20), primary_key = True)
    name = Column(String(20))
    user_id = Column(String(20), ForeignKey('user.id'))
    user = relationship('User', backref='Book')

#测试入口
def Test():
    #用于连接数据库
    engine = create_engine('mysql+mysqlconnector://root:alvin@localhost:3306/test')
    #初始化连接对象
    DBSession = sessionmaker(bind = engine)
    session = DBSession()
    #通过ORM实现新增记录操作
    new_user = User(id='11', name='Tom')
    session.add(new_user)
    new_book = Book(id='9', name='book1', user_id='11')
    session.add(new_book)
    new_book = Book(id='10', name='book2', user_id='5')
    session.add(new_book)
    #提交数据操作
    session.commit()
    #通过ORM实现查询数据操作
    user = session.query(User).filter(User.id == '5').one()
    print user.name if user else 'None'
    print ('there are %d books of %s' % (len(user.books), user.name)) if user else 'None' 
    books = session.query(Book).filter(Book.user_id == '5')
    if books:
        for b in books:
            print 'book(%s:%s) belong to %s' % (b.id, b.name, b.user.name)
    #关闭连接
    session.close()
今天就学习到这里,下一节从WEB开发学起。