Flask- SQLAlchemy

1. SQLAlchemy
- relationship
- 子查询

子查询:
session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
"""
select * from users where id in (select id from xxx)
"""


subqry = session.query(func.count(Server.id).label("sid")).filter(Server.id == Group.id).correlate(Group).as_scalar()
result = session.query(Group.name, subqry)
"""
1 A组 6
2 B组 3
"""

"""
SELECT
`group`.name AS group_name,
(SELECT count(server.id) AS sid FROM server WHERE server.id = `group`.id) AS anon_1
FROM `group`
"""


补充:
课程表:
id title
1 物理
2 生物
3 化学


成绩表:
id 课程ID 学生姓名 分数 班级
1 1 请柬 100 小班
2 1 卢刚 50 小班
3 2 求生表 50 小班
3 3 海东 60 小班
4 2 树林 70 大班
5 1 思博 90 大班
6 3 卢刚2 80 大班

需求:
课程ID 课程名称 小班(考的最高的成绩) 大班(考的最低的成绩)
1 物理 100 90
2 生物 50 70
3 化学 60 80



select
id,
title,
1,
(select max(分数) from 成绩表 where 班级=小班 and 课程表.id = 成绩表.课程ID) as x1 , # 记住,一次返回一个值
(select min(分数) from 成绩表 where 班级=大班 and 课程表.id = 成绩表.课程ID) as x1
from
课程表

课程ID 课程名称 小班(考的最高的成绩) 大班(考的最低的成绩)
1 物理 100 90
2 生物 50 70
3 化学 60 80

2. SQLAlchemy-Utils,提供choice功能

定义:
# pip3 install sqlalchemy-utils
from sqlalchemy_utils import ChoiceType

Base = declarative_base()


class Xuan(Base):
__tablename__ = 'xuan'
types_choices = (
(1,'欧美'),
(2,'日韩'),
(3,'老男孩'),
)
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64))
types = Column(ChoiceType(types_choices,Integer()))

__table_args__ = {
'mysql_engine':'Innodb',
'mysql_charset':'utf8',
}



查询:
result_list = session.query(Xuan).all()
for item in result_list:
print(item.types.code,item.types.value)

3. scoped_session
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
engine = create_engine(
"mysql+pymysql://root:[email protected]:3306/s6?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
SessionFactory = sessionmaker(bind=engine)
# 方式一:由于无法提供线程共享功能,所有在开发时要注意,在每个线程中自己创建 session。
# from sqlalchemy.orm.session import Session
# 自己具有操作数据库的:'close', 'commit', 'connection', 'delete', 'execute', 'expire',.....
session = SessionFactory()

# print('原生session',session)
# 操作
session.close()


# 方式二:支持线程安全,为每个线程创建一个session
# - threading.Local
# - 唯一标识
# ScopedSession对象
# self.registry(), 加括号 创建session
# self.registry(), 加括号 创建session
# self.registry(), 加括号 创建session
from greenlet import getcurrent as get_ident
session = scoped_session(SessionFactory,get_ident)
# session.add
# 操作
session.remove()

4. Flask-SQLAlchemy
- 前4步
5. Flask-Migrate
- 第5步

执行命令:
初次:python manage.py db init

python manage.py db migrate
python manage.py db upgrade

以后执行SQL时:
方式一:
result = db.session.query(models.User.id,models.User.name).all()
db.session.remove()
方式二:
result = models.Users.query.all()

都用到那些组件:
Flask
数据库
DBUtils
SQLAlchemy
Flask-Session
Flask-Script
Flask-Migrate
Flask-SQLAlchemy
Blinker
WTForms

# 获取环境中所有安装的模块
pip3 freeze
pip3 freeze > requirements.txt

# pip3 install pipreqs
# 获取当前所在程序目录中涉及到的所有模块,并自动生成 requirements.txt 且写入内容。
pipreqs ./


以后别人给你程序:
requirements.txt



进入程序目录:
pip3 install -r requirements.txt

猜你喜欢

转载自www.cnblogs.com/supery007/p/8275837.html