ORM: 对象关系映射 (Object - Relational - Mapping)
作用: 在关系型数据库和业务实体对象之间的一个映射好处: 在具体的操作业务对象的时候,可以不用使用SQL语句,只是简单的操作对象的属性和方法。工具: SQLAlchemy 它是Python 编程语言下的一款开源软件。提供了SQL工具包及对象关系映射的工具。为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。 SQLAlchemy 与数据库之间的关系:连接数据库 eg : engine = create_engine(“mysql+pymysql://root:westos@172.25.254.123/pymysql”, encoding=‘utf8’, max_overflow = 5, echo=True ) create_engine 是用来建立数据库的连接。 max_overflow : 最大连接数 echo=True 可以在控制台看到操作涉及的SQL语言。
定义缓存的对象 Session = sessionmaker(bind=engine) session = Session()
定义基类 Base = declarative_base()
定义数据库 一个映射就对应着 一个Python类, 用来表示一个表的结构 基于这个基类来创建我们的自定义类, 一个类就是一个数据库表 eg:
class Person(Base): __tablename__ = 'persons' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False) email = Column(String(30), unique=True def __repr__(self): return self.name创建表
if name == ‘__ main __’: # 创建数据表 Base.metadata.create_all(engine)`
添加单条数据
p = Person(id=1, name=“root”, email=‘root@westos.org’) #先将数据写入缓存 session.add( p ) #将缓存中的数据提交到数据库并执行 session.commit()
添加多条数据
p1 = Person(name=‘A’) p2 = Person(name=‘B’) #先将数据写入缓存; session.add_all((p1, p2)) #将缓存中的数据提交到数据库并执行 session.commit()
查找数据 results = session.query(Person).all() #查找表的所有数据 print(results)results = session.query(Person).first() #查找表的第一条数据 print(results)
obj = session.query(Person).filter_by(name=‘粉条’).first() print(“邮箱地址:”, obj.email)
删除数据 #删除数据,没有first/all方法, 默认返回的是要执行的sql语句; obj = session.query(Person).filter_by(name=‘B’).first() print(obj) session.delete(obj) session.commit()
更新数据 obj = session.query(Person).filter_by(name=‘B’).first() obj.email = ‘hello.qq.com’ session.add(obj) session.commit()
实验完整代码如下:
from sqlalchemy import create_engine, Column, Integer, SmallInteger, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:westos@172.25.254.123/pymysql", encoding='utf8', # echo=True ) #创建缓存对象 Session = sessionmaker(bind=engine) session = Session() #声明基类 Base = declarative_base() class Person(Base): __tablename__ = 'persons' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False) email = Column(String(30), unique=True def __repr__(self): return self.name if __name__ == '__main__': # 创建数据表 Base.metadata.create_all(engine) # # 添加单条数据 p = Person(id=1, name="粉条", email='fentiao@westos.org') session.add(p) session.commit() # 将缓存中的数据提交到数据库并执行 # 先将数据写入缓存; # 添加多条数据 p1 = Person(name='A') p2 = Person(name='B') # 先将数据写入缓存; session.add_all((p1, p2)) # 将缓存中的数据提交到数据库并执行 session.commit() # 查找数据 select * from students where () results = session.query(Person).all() # 查找表的所有数据 print(results) results = session.query(Person).first() # 查找表的第一条数据 print(results) obj = session.query(Person).filter_by(name='粉条').first() print("邮箱地址:", obj.email) # 删除数据,没有first/all方法, 默认返回的是要执行的sql语句; obj = session.query(Person).filter_by(name='B').first() print(obj) session.delete(obj) session.commit() # 更新数据: 更新姓名为B的邮箱为hello@qq.com obj = session.query(Person).filter_by(name='B').first() obj.email = 'hello.qq.com' session.add(obj) session.commit()