ORM 思想

Posted iwss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM 思想相关的知识,希望对你有一定的参考价值。

一、ORM技术简介

  1.ORM:及Object-Relational Mapping,把关系数据库的表结构映射到对象上 我们先来可能一个例子: 如果我们从数据库查出来几条数据,需要你在python中表示出来,如果你没有接触过ORM技术,你或许会使用下面的形式来存储这个数据: [ (1, ‘ling’), (2, ‘shang’), (3, ‘huo’), ] 如果你想知道表结构是什么样的,是不是就费劲了,如果你想快速的出其中的元素,就需要听听ORM的思想了。

  2.数据库中每次查出来的数据都用一个类表示,这个类的属性和数据库中表的字段一一对应。多条数据,就是一个list,每一行数据都是一个类来表示,如下所示: class User(object): def __init__(self, id, name): self.id = id self.name = name [ User(1, “ling”), User(2, “shang”), User(3, “huo”), ] 当我们需要获得id,或者name的时候,只需要通过循环获取到对象,直接通过user1.id或者user1.name就可以获取到id和name的属性。并且使得数据的存取非常的规范,这样ORM架构应用而生。

  3.Python中最有名的ORM架构就是SQLAlchemy,我们主要就是来学习SQLAlchemy的使用 安装环境: pip install SQLAlchemy 安装mysql yum install mysql-server mysql service mysqld restart sysctmctl restart mysql.service 创建数据库 create database sqlalchemy; 授权: GRANT ALL PRIVILEGES ON *.* TO ‘xiang‘@‘%‘ IDENTIFIED BY ‘xiang’;

  4.初始化连接: from sqlalchemy import create_engine engine = create_engine(‘mysql://xiang:[email protected]/sqlalchemy‘, echo=True) echo参数为True时,会显示每条执行的SQL语句,可以关闭, create_engine()返回一个Engine的实例,并且它表示通过数据库语法处理细节的核心接口,在这种情况下,数据库语法将会被解释成python的类方法。 mysql://xiang:[email protected]/sqlalchemy mysql: 指定是哪种数据库连接 第一个xiang: 用户名 第二个xiang: xiang用户对应的密码 192.168.48.131: 数据库的ip sqlalchemy: 数据库需要连接库的名字

  5.创建表格 1. 主要是通过sql语句来创建表格: from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker sql = ‘‘‘create table student( id int not null primary key, name varchar(50), age int, address varchar(100)); ‘‘‘

  6.Column类 构造函数: Column.__init__(self, name, type_, *args, **kwargs) 1、name 列名 2、type_ 类型,更多类型 sqlalchemy.types 3、*args Constraint(约束), ForeignKey(外键), ColumnDefault(默认), Sequenceobjects(序列)定义 4、key 列名的别名,默认None 下面是可变参数 **kwargs 5、primary_key 如果为True,则是主键 6、nullable 是否可为Null,默认是True 7、default 默认值,默认是None 8、index 是否是索引,默认是True 9、unique 是否唯一键,默认是False 10、onupdate 指定一个更新时候的值,这个操作是定义在SQLAlchemy中,不是在数据库里的,当更新一条数据时设置,大部分用于updateTime这类字段 11、autoincrement 设置为整型自动增长,只有没有默认值,并且是Integer类型,默认是True 12、quote 如果列明是关键字,则强制转义,默认False

  7.创建会话: 说到数据库,就离不开Session。Session的主要目的是建立与数据库的会话,它维护你加载和关联的所有数据库对象。它是数据库查询(Query)的一个入口。 在Sqlalchemy中,数据库的查询操作是通过Query对象来实现的。而Session提供了创建Query对象的接口。 Query对象返回的结果是一组同一映射(Identity Map)对象组成的集合。事实上,集合中的一个对象,对应于数据库表中的一行(即一条记录)。所谓同一映射,是指每个对象有一个唯一的ID。如果两个对象(的引用)ID相同,则认为它们对应的是相同的对象。 要完成数据库查询,就需要建立与数据库的连接。这就需要用到Engine对象。一个Engine可能是关联一个Session对象,也可能关联一个数据库表。 当然Session最重要的功能还是实现原子操作。 ORM通过session与数据库建立连接进行通信,如下所示: from sqlalchemy.orm import sessionmaker DBSession = sessionmaker(bind=engine) session = DBSession() 通过sessionmake方法创建一个Session工厂,然后在调用工厂的方法来实例化一个Session对象。

  8.(1).查询: 查询是这个里面最为复杂,最为繁琐的一个步骤。 通过Session的query()方法创建一个查询对象。这个函数的参数数量是可变的,参数可以是任何类或者是类的描述的集合。下面来看一个例子: my_stdent = session.query(Student).filter_by(name="lingxiangxiang2").first() print(my_stdent) 此时我们看到的输出结果是这样的: <__main__.Student object at 0x032745F0> 前面我们在赋值的时候,我们可以通过实例化一个对象,然后直接映射到数据库中,那我们在查询出来的数据sqlalchemy直接给映射成一个对象了(或者是每个元素为这种对象的列表),对象和我们创建表时候的class是一致的,我们就也可以直接通过对象的属性就可以直接调用就可以了。 print(my_student.id, my_student.name, my_student.age, my_student.address) 结果: (10003L, ‘lingxiangxiang2‘, 182L, ‘shanxi‘)

  (2).查询: filter()和filter_by()的区别: Filter: 可以像写 sql 的 where 条件那样写 > < 等条件,但引用列名时,需要通过 类名.属性名 的方式。 filter_by: 可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。,参数名对应名类中的属性名,但似乎不能使用 > < 等条件。 当使用filter的时候条件之间是使用“==",fitler_by使用的是"="。 user1 = session.query(User).filter_by(id=1).first() user1 = session.query(User).filter(User.id==1).first() filter不支持组合查询,只能连续调用filter来变相实现。 而filter_by的参数是**kwargs,直接支持组合查询。 比如: q = sess.query(IS).filter(IS.node == node and IS.password == password).all()

 

课堂案例如下:


案例一、
class Student(object):
def __init__(self, id, name, age, sex, grander):
self.id = id
self.name = name
self.age = age
self.sex = sex
self.grander = grander

student1 = Student(‘10001‘, ‘ling‘, 25, ‘M‘, 78)
print(student1.name)

案例二、

1.安装sqlachemy
pip install SQLAchemy

cus = engine.connect() 这个跟我们上节课说的游标操作雷同的

from sqlalchemy import create_engine
#创建工程,数据库连接。
engine = create_engine(‘mysql+pymysql://xiang:[email protected]/sqlalchemy‘)
print(engine)
sql = ‘‘‘create table student(
id int not null PRIMARY KEY,
name varchar(100),
age int,
address varchar(100)
);‘‘‘

cus = engine.connect()
cus.execute(sql)
cus.close()


案例三:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

engine = create_engine(‘mysql+pymysql://xiang:[email protected]/sqlalchemy‘)
metadata = MetaData(engine)

teacher = Table(‘teacher‘, metadata,
Column(‘id‘, Integer, primary_key=True),
Column(‘name‘, String(50), ),
Column(‘age‘, Integer),
Column(‘sex‘, String(10)),
)
metadata.create_all(engine)


案例四:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


engine = create_engine(‘mysql+pymysql://xiang:[email protected]/sqlalchemy‘)
DBsession = sessionmaker(bind=engine)
session = DBsession()

Base = declarative_base()

class Student(Base):
__tablename__ = ‘student‘
id = Column(Integer, primary_key=True)
name = Column(String(100))
age = Column(Integer)
address = Column(String(100))

student1 = Student(id=1001, name=‘ling‘, age=25, address="beijing")
student2 = Student(id=1002, name=‘molin‘, age=18, address="jiangxi")
student3 = Student(id=1003, name=‘karl‘, age=16, address="suzhou")

# session.add_all([student1, student2, student3])
# session.commit()
# session.close()

a = session.query(Student).filter(Student.id>1001).all()
print(a)
for i in a:
print(i.id)
print(i.name)
print(i.age)
print(i.address)


案例五,注意事项。

filter和filter_by

filter_by(name="ling") 不能使用> < =
filter(Student.id>1001) 这个就必须使用Student.id 可以使用> < =等


以上是关于ORM 思想的主要内容,如果未能解决你的问题,请参考以下文章

ORM 思想

SpringDataJPA

ORM基础

学习MyBatis必知必会~准备工作:了解框架三层架构ORM思想

MybatisPlus 实体类与数据库表映射关系&MybatisPlus:ORM思想

高效掌握JDBC技术| 掌握ORM思想 | 定义连接数据库的工具类