ORM 和 SQLAlchemy 操作使用数据库

ORM 框架

介绍

全称 Object Relational Mapping, 翻译过来叫 对象关系映射 。
简单的说,ORM将数据库中的表与面向对象语言中的类建立了一种对应关系。
这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。

SQLAlchemy

1.介绍

SQLAlchemy是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型

SQLAlchemy 实际上就是利用 Python 来构建表示关系型数据库结构和表达式的系统

使用起来类似于我们在下层的数据库中直接使用 SQL 表达式一样,但实际上它为不同数据库实现的差异提供了一层抽象。

2.特点

  • SQLALchemy是对数据库操作的封装,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
  • SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作

3. 安装SQLAlchemy

3.1 安装命令

pip install sqlalchemy

4.SQLAlchemy操作数据库

4.1 创建数据库

create database ceshi charset=utf8;

4.2 SQLAlchemy连接数据库

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://用户名:密码@ip地址:3306/ceshi?charset=utf8'')
print(engine)

4.3 使用ORM框架原理 以类的形式来创建数据表

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


链接是需要指定要用到的MySQL数据库
engine = create_engine('mysql+pymysql://root:python@localhost:3306/ceshi?charset=utf8', echo=True)
Base = declarative_base()  # 生成SQLORM基类


class User(Base):
    # 对应MySQL中数据表的名字
    __tablename__ = 'users'

    # 创建字段
    id = Column(Integer, primary_key=True)  # users表中的id字段(主键)
    username = Column(String(64), nullable=False, index=True)  # users表中的username字段
    password = Column(String(64), nullable=False)  # users表中的password字段
    email = Column(String(64), nullable=False, index=True)  # users表中的email字段(有索引)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.username)


# 执行下面的代码,会创建users表(所有表结构)
Base.metadata.create_all(engine)

SQLAlchemy操作数据库(增删改查)

  • 插入
  1. 插入一条数据
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
# 创建新User对象
new_user = User(id='1', username='python-teacher', password="123456", email="dong4716138@163.com")
# new_user = User(username='python-teacher', password="123456", email="dong4716138@163.com")
# 添加到session
session.add(new_user)
# 提交即保存到数据库
session.commit()
# 关闭session
session.close()
  1. 插入多条数据
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
new_user1 = User(username='python-teacher2', password="112233", email="laoyan@163.com")
new_user2 = User(username='python-teacher3', password="654321", email="laoma@163.com")
new_user3 = User(username='python-teacher4', password="789012", email="laoye@163.com")
session.add_all([new_user1, new_user2, new_user3])
session.commit()
session.close()
  • 查询
    1.查询所有数据
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
# 获取所有数据
obj = session.query(User).all()
# print(type(obj))  # 查询出来的类型是 <class 'list'>
# 说明:
# obj查询出来的是一个列表,其中数据为 User类的实例对象
for temp in obj:
    print("-" * 20)
    # print(temp)  # 此时temp为User类的实例对象
    # print(type(temp))  # 类型是 <class '__main__.User'>
    print(temp.id)
    print(temp.username)
    print(temp.password)
    print(temp.email)
session.close()
  1. 条件查询
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例

# 获取指定数据
obj = session.query(User).filter(User.id == 1).one()
print(obj.id)
print(obj.username)
print(obj.password)
print(obj.email)

print("-" * 20)

obj = session.query(User).filter(User.id == 4).one()
print(obj.id)
print(obj.username)
print(obj.password)
print(obj.email)

session.close()
  1. 查询第一个数据
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
# 获取返回数据的第一行
obj = session.query(User).first()
print(obj.id)
print(obj.username)
print(obj.password)
print(obj.email)
session.close()
  1. 根据条件查询指定字段
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例

# 查询ID>1的所有名字
obj = session.query(User.username).filter(User.id > 1).all()
# print(type(obj))  # 类型是 <class '__main__.User'>
for temp in obj:
    # print(temp.id)  # 不能查询,因为在上面的查询中指定了是username字段,而没有指定其他的
    print(temp.username)
# print(temp.password)  # 不能查询,因为在上面的查询中指定了是username字段,而没有指定其他的
# print(temp.email)  # 不能查询,因为在上面的查询中指定了是username字段,而没有指定其他的

session.close()
  • 修改
    1.方式一
 DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例

# 按照条件修改,返回修改的条数
user = session.query(User).filter(User.username == "python-teacher").one()
user.username = 'laowang'
session.commit()

session.close()

2.方式二

DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
user = session.query(User).filter(User.username == "laowang").update({"username": "new-laowang"})
session.commit()
session.close()
  • 删除
DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话,返回的是一个类
# 创建session对象
session = DBSession()  # 生成链接数据库的实例
# 查处需要删除的对象
obj = session.query(User).filter(User.id == 6).one()  # 第二次执行会失败,因为已经被删除了所以没有查询到数据
# obj = session.query(User).filter(User.id >= 6).all()  # 不能对查询的列表使用delete删除
# 删除对象
session.delete(obj)
# 提交结果
session.commit()
session.close()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值