天天看点

python里用ORM——SQLAlchemy操作mysql数据库orm使用

ORM介绍

orm全称object relational mapping,就是对象映射关系程序。

简单来说,对于面向对象的语言来说一切皆对象,但是我们使用的数据库却都是关系型的。

为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,

这样我们在使用编程语言对数据库进行操作的时候可以直接使用类似面向对象的操作进行,而不用直接使用sql语言。

也就是对sql功能的封装,在以后使用时,通过对象.方法来进行增删改查。

orm的优点:

  1. 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑SQL语句。快速开发,由此而来。
  2. ORM使我们构造固化数据结构变得简单易行。

缺点:

  1. 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

orm使用

在Python中,最有名的ORM框架是SQLAlchemy。

1、连接数据库

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

#创建连接
'''什么数据库+数据库的包://用户名:密码@主机/数据库名称(db)'''
engine = create_engine("mysql+pymysql://root:[email protected]/us_states",
                       encoding='utf-8', echo=False) #echo表示是否打印所有操作信息
           

2、创建表格和插入数据

Base = declarative_base()  # 生成orm基类

#表的类,表的结构,要先用类的形式写好这个表格
class User(Base):   #继承基类
    __tablename__ = 'user'  # 表名
    #下面3个是列
    id = Column(Integer, primary_key=True)  #column是列,id是主键
    name = Column(String(32))
    password = Column(String(64))


'''创建表格'''
Base.metadata.create_all(engine)


'''生成实例'''
Session_class = sessionmaker(bind=engine)  #返回的是类,创建与数据库的会话session类 ,这里返回给session的是个class,不是实例
Session = Session_class()  #这里再实例化,生成session实例,这个session就和pymysql里的cursor一样

'''插入数据'''
#这里就是面向对象的形式创建每一行的数据了
user_obj = User(name="lkk", password="lkk111")  # 生成你要创建的数据对象1
user_obj2 = User(name="lihua", password="lihua111")  # 生成你要创建的数据对象2
print(user_obj.name, user_obj.id)  # 此时还没创建对象,打印一下id发现还是None

Session.add(user_obj)  # 把要创建的数据对象添加到这个session里, 一会统一创建
Session.add(user_obj2)

print(user_obj.name, user_obj.id)  # 此时也依然还没创建

Session.commit()  # 现此才统一提交,创建(插入)数据,凡对数据进行了改动就要提交

           

3、查询数据

'''查数据'''
data = Session.query(User).filter_by().all()    #取全部出来
data = Session.query(User).filter_by().first()  #取第一行
data = Session.query(User).filter(User.id > 2).all()  #取id>2的
data = Session.query(User).filter(User.id > 2).filter(User.id < 4).all()  #取4>id>2的
data = Session.query(User).filter(User.id == 2).all()  #取id=2的
print(data)
           

4、修改数据

'''修改数据'''
data = Session.query(User).filter(User.id == 2).all()  #取到id=2的
#单改一个属性
data.name = 'lkk1'  #现在可以改名字了
           

5、回滚

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())  # 再查就发现刚才添加的数据没有了。
           

6、统计和分组

'''统计和分组'''
from sqlalchemy import func
print(Session.query(User).filter(User.name.like("lk%")).count())    #查找表格中lk开头的人出现多少次
print(Session.query(User.name, func.count(User.name)).group_by(User.name).all() )   #统计每个name出现多少次
           

7、统计和分组

'''删除'''
Session.query(User).filter(User.id > 2).delete()
Session.commit()
           

8、链表查询

'''连表查询'''
ret = Session.query(User, Favor).filter(User.id == Favor.id).all()

ret = Session.query(Person).join(Favor).all()

ret = Session.query(Person).join(Favor, isouter=True).all()