好风凭借力,送我上青云。
介绍
SQLAlchemy对象关系映射器提供了一种将用户定义的Python类与数据库表以及这些类(对象)的实例与相应表中的行关联起来的方法
1. 安装
pip install sqlalchemy -i https://pypi.doubanio.com/simple
2. 连接
from sqlalchemy import create_engine
# 数据库基本信息
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'flask'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
# 连接数据库,echo:表示日志
engine = create_engine(DB_URI, echo=False)
# 判断是否连接成功
conn = engine.connect()
print(conn.execute("select 1").fetchone())
3. 映射
在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。
# 声明映射,创建一个ORM基类。
Base = declarative_base(engine)
# 映射类
class User(Base):
# 指定这个模型映射到数据库中的表名
__tablename__ = 'user'
# primary_key:主键
# autoincrement:自增长
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
fullname = Column(String(length=50))
nickname = Column(String(length=50))
def __repr__(self):
return "<User(name='%s',fullname='%s',nickname='%s'>" % (self.name, self.fullname, self.nickname)
# 来将模型映射到数据库中,相当于执行create table
Base.metadata.create_all()
4. 会话
会话就是在连接到当前数据库,可以对数据库进行CRUD操作
# 创建会话
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
# 所有和数据库的ORM操作都必须通过一个叫做`session`的会话对象来实现
session = Session()
5. CRUD操作
5.1 增
- 单个对象添加
# 添加对象
user = User(name='ydy', fullname='ydongy', nickname='yaodongyang')
# 把对象添加到会话中
session.add(user)
# 对session中的对象做commit操作
session.commit()
- 多个对象一起添加
# 一次添加多条
user1 = User(name='zs', fullname='zhangsan', nickname='张三')
user2 = User(name='ls', fullname='lisi', nickname='李四')
# 刷新到当前事务
session.add_all([user1, user2])
# 提交
session.commit()
5.2 查
- 查找所有
users = session.query(User).all()
# 返回对象列表
# print(users)
- filter_by查询
u = session.query(User).filter_by(name='ydy').all()
print(u)
- filter查询
u = session.query(User).filter(User.name == 'ydy').all()
print(u)
- get查询
# 使用get方法查找数据是根据id来查找的
u = session.query(User).get(3)
print(u)
first()
:返回查询集的第一条数据all()
:返回符合条件的所以查询集
当在查询语句的末尾不添加
all()
和first()
的时候,仅仅只是query返回的是需要执行的sql语句
5.3 改
u = session.query(User).first()
u.name = 'aaa'
# 提交
session.commit()
# 回滚
session.rollback()
5.4 删
u = session.query(User).first()
session.delete(u)
session.commit()