orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。
orm的优点:
- 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
- ORM使我们构造固化数据结构变得简单易行。
缺点:
- 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
import sqlalchemy from sqlalchemy import create_engine,func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:123456@192.168.181.128/school_data", encoding='utf-8', echo=True)#类似于pymysql 的connect,echo等于True要刷日志 Base = declarative_base() # 生成orm基类,定义一个实例,所有表必须继承该实例 class User(Base): __tablename__ = 'user' # 表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<%s name:%s>"%(self.id,self.name) Base.metadata.create_all(engine) # 创建表结构 Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 Session = Session_class() # 生成session实例,类似于pymysql的cursor #创建数据 # user_obj = User(name="LHTEST3", password="123456") # 生成你要创建的数据对象 # print(user_obj.name, user_obj.id) # 此时还没创建对象呢,不信你打印一下id发现还是None # Session.add(user_obj) # 把要创建的数据对象添加到这个session里, 一会统一创建 # print(user_obj.name, user_obj.id) # 此时也依然还没创建 # Session.commit() # 现此才统一提交,创建数据 #查询数据 # my_user =Session.query(User).filter_by(name="LHTEST").first()#qlalchemy帮你把返回的数据映射成一个对象 # print(my_user,my_user.id,my_user.name,my_user.password) my_user1 =Session.query(User).filter_by(name="lhtest").all()#qlalchemy帮你把返回的数据映射成一个对象,filter_by用于等于,filter用于大于小于 print(my_user1) #修改数据 # my_user = Session.query(User).filter_by(name="LHTEST").first() # my_user.name = "lhtest" # Session.commit() #回滚 # my_user = Session.query(User).filter_by(id=1).first() # my_user.name = "Jack" # fake_user = User(name='Rain', password='12345') # Session.add(fake_user) # print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 这时看session里有你刚添加和修改的数据 # Session.rollback() # 此时你rollback一下 # print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 再查就发现刚才添加的数据没有了。 #获取所有数据 # print(Session.query(User.name,User.id,User.password).all() ) #多条件查询 objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()#上面2个filter的关系相当于 user.id >1 AND user.id <7 的效果 objs1 = Session.query(User).filter(User.id>0).filter(User.id<7).count() print(objs1) print(objs[1].name)#多个对象取值 #统计和分组 data=Session.query(User).filter(User.name.like("lh%")).count() print(data) print(Session.query(func.count(User.name),User.name).group_by(User.name).all() ) print(Session.query(func.count(User.password),User.password).group_by(User.password).all() )