网站建设征集通讯员的通知,郑州网络营销网站优化,商城网站开发代码案例,网站如何提升流量目录11.SQLAlchemy11.1 简介11.2 安装11.3 基本使用11.4 连接11.5 数据类型11.6 执行原生sql11.7 插入数据11. 8 删改操作11.9 查询11.SQLAlchemy 
11.1 简介 
SQLAlchemy的是Python的SQL工具包和对象关系映射#xff0c;给应用程序开发者提供SQL的强大功能和灵活性。它提供了…
目录11.SQLAlchemy11.1 简介11.2 安装11.3 基本使用11.4 连接11.5 数据类型11.6 执行原生sql11.7 插入数据11. 8 删改操作11.9 查询11.SQLAlchemy 
11.1 简介 
SQLAlchemy的是Python的SQL工具包和对象关系映射给应用程序开发者提供SQL的强大功能和灵活性。它提供了一套完整的企业级的持久性模式专为高效率和高性能的数据库访问改编成简单的Python的领域语言。 SQLAlchemy是Python界的ORMObject Relational Mapper框架它两个主要的组件 SQLAlchemy ORM 和 SQLAlchemy Core 。 11.2 安装 
pip install SQLAlchemy11.3 基本使用 
创建表 
类使用声明式至少需要一个__tablename__属性定义数据库表名字并至少一Column是主键 
# SQLAlchemy练习
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, UniqueConstraint, Index
from sqlalchemy.ext.declarative import declarative_base
# declarative_base类维持了一个从类到表的关系通常一个应用使用一个base实例所有实体类都应该继承此类对象Base  declarative_base()# 类使用声明式至少需要一个__tablename__属性定义数据库表名字并至少一Column是主键
# 创建单表
class User(Base):__tablename__  usersid  Column(Integer, primary_keyTrue, autoincrementTrue)name  Column(String(32))extra  Column(String(16))def init_db():# 数据库链接引擎engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)# 创建表Base.metadata.create_all(engine)def drop_db():engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)# 删除表Base.metadata.drop_all(engine)if __name__  __main__:init_db()# drop_db()插入数据 
# SQLAlchemy练习
import models
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 数据库链接引擎
engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)se  sessionmaker(bindengine)
session  se()u1  models.User(namea1, extraaa)
u2  models.User(namea2, extrabb)session.add(u1)
session.add(u2)session.commit()
# session.rollback() # 回滚session.rollback()表示回滚 
11.4 连接 
SQLAlchemy 把一个引擎的源表示为一个连同设定引擎选项的可选字符串参数的 URI。URI 的形式是: 
dialectdriver://username:passwordhost:port/database该字符串中的许多部分是可选的。如果没有指定驱动器会选择默认的确保在这种情况下 不 包含  。 
Postgres: 
postgresql://scott:tigerlocalhost/mydatabaseMySQL: 
mysql://scott:tigerlocalhost/mydatabaseOracle:oracle: 
//scott:tiger127.0.0.1:1521/sidnameSQLite (注意开头的四个斜线): 
sqlite:absolute/path/to/foo.db11.5 数据类型 SQLAlchemy列选项 11.6 执行原生sql 
from sqlalchemy import create_engineengine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)# 执行SQL
cur  engine.execute(select * from users
)# 获取第一行数据
re1  cur.fetchone()
# 获取第n行数据
# re2  cur.fetchmany(2)
# 获取所有数据
re3  cur.fetchall()print(re3)
# 注意当执行fetchone()后数据已经被去除一条了即使fetchall()取出的数据也是从第二条数据开始的engine.execute默认使用了数据库连接池也可以使用DBUtils  pymysql做连接池 
11.7 插入数据 
创建如下表供后面增删改查使用。 
models2.py 
# sqlalchemy创建多个关联表
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, UniqueConstraint, Index, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
import datetimeBase  declarative_base()class Classes(Base):__tablename__  classesid  Column(Integer, primary_keyTrue, autoincrementTrue)name  Column(String(32), nullableFalse, uniqueTrue)class Student(Base):__tablename__  studentid  Column(Integer, primary_keyTrue, autoincrementTrue)username  Column(String(32), nullableFalse, uniqueTrue)password  Column(String(32), nullableFalse)ctime  Column(DateTime, defaultdatetime.datetime.now)  # 注意now后不要加()# 外键对应的班级class_id  Column(Integer, ForeignKey(classes.id))class Hobby(Base):__tablename__  hobbyid  Column(Integer, primary_keyTrue, autoincrementTrue)caption  Column(String(32), default篮球)# 建立多对多的关系
class Student2Hobby(Base):__tablename__  student2hobbyid  Column(Integer, primary_keyTrue, autoincrementTrue)student_id  Column(Integer, ForeignKey(student.id))hobby_id  Column(Integer, ForeignKey(hobby.id))# 增加联合唯一索引__table_args__  (UniqueConstraint(student_id, hobby_id, nameuni_student_id_hobby_id),)def init_db():# 数据库链接引擎engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)# 创建表Base.metadata.create_all(engine)def drop_db():engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)# 删除表Base.metadata.drop_all(engine)if __name__  __main__:init_db()# drop_db()上面创建完表后开始执行插入操作 
# sqlalchemy的增删改查import models2
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 数据库链接引擎
engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)se  sessionmaker(bindengine)
session  se()# 单条增加
# c1  models2.Classes(namepython入门)
# session.add(c1)
# session.commit()
# session.close()# 多条增加
# c2  [
#     models2.Classes(namepython进阶),
#     models2.Classes(namepython高级),
#     models2.Classes(namepython web)
# ]
# session.add_all(c2)
# session.commit()
# session.close() 
11. 8 删改操作 
# sqlalchemy的增删改查import models2
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 数据库链接引擎
engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)se  sessionmaker(bindengine)
session  se()# 删除
# session.query(models2.Classes).filter(models2.Classes.id  2).delete()
# session.commit()# 修改
# session.query(models2.Classes).filter(models2.Classes.id  2).update({name : 099})
session.query(models2.Classes).filter(models2.Classes.id  2).update({models2.Classes.name: models2.Classes.name  099}, synchronize_sessionFalse)
synchronize_session  False  # 对字段执行字符串操作
# session.query(models2.Classes).filter(models2.Classes.id  2).update({num: models2.Classes.num  1}, synchronize_sessionevaluate)
# synchronize_session  evaluate  # 对字段执行数值型操作
session.commit()11.9 查询 
参考Flask-SQLAlchemy - 武沛齐 - 博客园 (cnblogs.com) 
1.以下的方法都是返回一个新的查询需要配合执行器使用。 
filter(): 过滤功能比较强大多表关联查询。 filter_by()过滤一般用在单表查询的过滤场景。 
order_by()排序。默认是升序降序需要导包from sqlalchemy import * 。然后引入desc方法。比如order_by(desc(“email”)).按照邮箱字母的降序排序。 
group_by()分组。 
2.以下都是一些常用的执行器配合上面的过滤器使用。 
get()获得id等于几的函数。 
比如查询id1的对象。 
get(1)切记括号里没有“id”直接传入id的数值就ok。因为该函数的功能就是查询主键等于几的对象。 
all()查询所有的数据。 
first()查询第一个数据。 
count()返回查询结果的数量。 
paginate()分页查询返回一个分页对象。 
paginate(参数1参数2参数3)参数1当前是第几页参数2每页显示几条记录参数3是否要返回错误。 
返回的分页对象有三个属性items获得查询的结果pages获得一共有多少页page获得当前页。 
3.常用的逻辑符 
需要导入包才能用的有from sqlalchemy import * 
not_、and_、or_ 还有上面说的排序desc。 
常用的内置的有in_表示某个字段在什么范围之中。 
4.其他关系的一些数据库查询 
endswith()以什么结尾。 
startswith()以什么开头。 
contains()包含 
# sqlalchemy的增删改查import models2
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import text# 数据库链接引擎
engine  create_engine(mysqlpymysql://root:root127.0.0.1:3306/flask01?charsetutf8, max_overflow5)se  sessionmaker(bindengine)
session  se()# 查询r1  session.query(models2.Classes).all()  # 返回models2.Classes对象# label相当于sql里的as取别名后面结果集使用也是使用别名
r2  session.query(models2.Classes.name.label(xx), models2.Classes.name).all()# 查询课程名字为python入门的课程
r3  session.query(models2.Classes).filter(models2.Classes.name  python入门).all()
# 也可使用filter_by注意filter_by的传参和filter不一样
r4  session.query(models2.Classes).filter_by(namepython入门).all()# 查询课程名字为python入门的课程的第一个
r5  session.query(models2.Classes).filter_by(namepython入门).first()# 查询id2且课程名字为python入门的课程
r6  session.query(models2.Classes).filter(text(id:value and name:name)).params(value2, namepython入门).order_by(models2.Classes.id).all()# from_statement相当于子查询
r7  session.query(models2.Classes).from_statement(text(SELECT * FROM Classes where name:name)).params(namepython入门).all()print(r7)
session.close()
# 注意除了r2其他结果都为models2.Classes对象# 条件
ret  session.query(Users).filter_by(namealex).all()
ret  session.query(Users).filter(Users.id  1, Users.name  eric).all()
ret  session.query(Users).filter(Users.id.between(1, 3), Users.name  eric).all()
ret  session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret  session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret  session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(nameeric))).all()
from sqlalchemy import and_, or_
ret  session.query(Users).filter(and_(Users.id  3, Users.name  eric)).all()
ret  session.query(Users).filter(or_(Users.id  2, Users.name  eric)).all()
ret  session.query(Users).filter(or_(Users.id  2,and_(Users.name  eric, Users.id  3),Users.extra ! )).all()# 通配符
ret  session.query(Users).filter(Users.name.like(e%)).all()
ret  session.query(Users).filter(~Users.name.like(e%)).all()# 限制
ret  session.query(Users)[1:2]# 排序
ret  session.query(Users).order_by(Users.name.desc()).all()
ret  session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()# 分组
from sqlalchemy.sql import funcret  session.query(Users).group_by(Users.extra).all()
ret  session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).all()ret  session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) 2).all()# 连表ret  session.query(Users, Favor).filter(Users.id  Favor.nid).all()
# 默认使用外键进行连表
ret  session.query(Person).join(Favor).all()  # 内连接ret  session.query(Person).join(Favor, isouterTrue).all() # 左连接# 组合
q1  session.query(Users.name).filter(Users.id  2)
q2  session.query(Favor.caption).filter(Favor.nid  2)
ret  q1.union(q2).all()q1  session.query(Users.name).filter(Users.id  2)
q2  session.query(Favor.caption).filter(Favor.nid  2)
ret  q1.union_all(q2).all() 
参考 https://blog.csdn.net/u011146423/article/details/87605812 
 Python开发【第十九篇】Python操作MySQL - 武沛齐 - 博客园 (cnblogs.com) 
 SQLAlchemy 学习笔记_JP.Zhang-CSDN博客