SQLAlchemy
-
flask-sqlalchemy
如何进行配置SQLALCHEMY_DATABASE_URI = "mysql+pymysql://用户名:密码@主机地址:端口号/数据库名?charset=utf8"
-
常见的字段类型有哪些?
String/Integer/DateTime/DECIMAL/Text
-
数据添加
# 单条数据添加 user_obj = UserModel(字段名=值) db.session.add(user_obj) db.session.commit() # 批量数据添加 u1 = UserModel(字段名=值) u2 = UserModel(字段名=值) u3 = UserModel(字段名=值) u4 = UserModel(字段名=值) db.session.add_all([u1,u2,u3,u4]) db.session.commit()
-
数据查询
# 查询所有 UserModel.query.all() # 查询单条数据 UserModel.query.first() # 查询name=majiahui UserModel.query.filter_by(name="majiahui").first() # 查询姓周的同学都有谁? UserModel.query.filter(UserModel.name.like("{}%".format(name))).all() # 查询 带有 晴 字的同学都有谁? UserModel.query.filter(UserModel.name.contains("晴")).all() #对所有的数据id进行降序排序 UserModel.query.order_by(UserModel.id.desc()).all() #对所有的数据id进行升序排序 UserModel.query.order_by(UserModel.id.asc()).all() # 获取数据的总数 UserModel.query.count() # 分页 UserModel.query.limit(页大小).offset(偏移量).all()
-
数据编辑
# 第一种 UserModel.query.update({"name":"mayekang"}) db.session.commit() # 第二种 userobj = UserModel.query.filter_by(id=id).first() userobj.name = "xxxx" db.session.add(user_obj) db.session.commit()
-
数据删除
UserModel.query.filter_by(id=id).filter_by(age=12).delete()
二、单表数据查询补充
-
or_ , and_ , in_ 查询
-
select * from user where name=‘xx’ and age=17;
from sqlalchemy import or_, and_ task_filter = { or_( and_( Task.task_department == current_user.user_department, Task.task_commit_status > 0, Task.task_complete_time >= prev, ), and_( Task.task_complete_time >= prev, Task.task_members.like('%,'+str(current_user.user_id)+',%'), ) ) } Task.query.filter(*task_filter).all()
-
比较查询 < >
session.query(Task).filter(Task.task_complete_time == prev).all()
-
聚合查询
func
-
求总数
User.query.filter_by(role_id=3,username='susan').count()
-
求和(sum)
from sqlalchemy.orm import func User.query.with_entities(func.sum(User.id)).all() session.query(func.sum(Staff.id)).scalar()
-
平均数
User.query.with_entities(func.avg(User.role_id)).all()
-
去重 select distinct name from user;
Staff.query.with_entities(Staff.name).distinct().all()
-
迁移与映射
-
flask-script 和 flask-migrate
django : python manage.py makemigrations / migrate
from flask_script import Manager from flask_migrate import Migrate, MigrateCommand from main import app from models import db # 将脚本注册到app上 manage = Manager(app) # 实例化迁移 migrate = Migrate(app,db) # 在脚本上添加迁移命令 manage.add_command("db",MigrateCommand) if __name__ == '__main__': manage.run()
-
启动的迁移命令
- python manage.py db init
- python manage.py db migrate
- python manage.py db upgrade
一对多关系
一对多关系是关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。
- 如图所示
- 举例今日头条
-
设计表结构
tag 标签字段有 id name state create_time
content 标签有 id name desc img state create_time
class Nav(db.Model): __tablename__ = 'nav' id = Column(Integer, autoincrement=True, primary_key=True) name = Column(String(32), unique=True) state = Column(SmallInteger, default=0) create_time = Column(DateTime) # 如果有需要就绑定 否则可以不写,写在哪测都可以 db.relationship("Content",backref="contents") class Content(db.Model): __tablename__ = 'content' id = Column(Integer, autoincrement=True, primary_key=True) name = Column(String(32), unique=True) state = Column(SmallInteger, default=0) create_time = Column(DateTime) # 外键 nav_id = Column(Integer, ForeignKey("nav.id"))