Flask 数据库 一对多 多对多
app.py
import os
from flask import Flask
# 引入表格模块
from flask_sqlalchemy import SQLAlchemy
#导入pymysql
import pymysql
#用pymysql 代替 MySqldb
pymysql.install_as_MySQLdb()
app=Flask(__name__)
# 获取文件路径
BASE_DIR=os.path.abspath(os.path.dirname(__file__))
# 配置数据库sqlite
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(BASE_DIR,'sqlite3.db')
#配置数据库mysql
# app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@127.0.0.1:3306/test'
# 创建一个父类让python中的类去继承 就可映射成表格
db=SQLAlchemy(app)
main.py
#控制文件
from app import app
from models import db
from views import *
if __name__ == '__main__':
#删除所有表
db.drop_all()
#创建所有表
db.create_all()
app.run(debug=True)
models.py
#存放类模块
from app import db
#抽象父类
class Base(db.Model):
__abstract__=True
id = db.Column(db.INT, primary_key=True, autoincrement=True)
#添加员工
def save(self):
# 保存对象
db.session.add(self)
# 提交事务
db.session.commit()
def updte(self):
db.session.commit()
def delete(self):
# 删除对象
db.session.delete(self)
# 提交事务
db.session.commit()
#职位
class Position(Base):
__tablename__="position"
name=db.Column(db.String(32)) #职位名称
level=db.Column(db.Integer) #级别
#关系属性
#为了查询方便,flask提供了关系属性,为了方便查询,但是不会在数据库中生成相应的字段
persons=db.relationship("Person",backref='position')
#当知道职位查询所有的员工时,通过 职位对象.persons就可以获得所有的员工
# 当员工查询对应的职位的时候,通过 员工对象.position就可获得对应的职位
# 职员
class Person(Base):
"""雇员表"""
__tablename__ = "person"
username = db.Column(db.VARCHAR(100))
password = db.Column(db.VARCHAR(64))
nickname = db.Column(db.String(64), nullable=True) # 昵称
gender = db.Column(db.String(8), nullable=True) # 性别
age = db.Column(db.Integer, nullable=True) # 年龄
workid = db.Column(db.String(32), nullable=True) # 工号
phone = db.Column(db.String(64), nullable=True) # 电话
email = db.Column(db.String(64), nullable=True) # 邮箱
photo = db.Column(db.String(64), nullable=True) # 照片
address = db.Column(db.Text, nullable=True) # 地址
score = db.Column(db.Float, nullable=True) # 绩效
#关系属性
#职位和员工一对多关系
position_id=db.Column(db.Integer,db.ForeignKey("position.id"))
#职位与权限中间表
permission_position=db.Table(
'permission_position',
db.Column("id",db.Integer,primary_key=True,autoincrement=True),
db.Column("position_id",db.Integer,db.ForeignKey("position.id")), #关联position
db.Column("permission_id",db.Integer,db.ForeignKey("permission.id")), #关联permission
)
#权限表
class Permission(Base):
__tablename__="permission"
name=db.Column(db.String(32)) #权限名称
desc=db.Column(db.String(128)) #权限描述
#关系属性
positions=db.relationship(
'Position',# 和模型类进行关联
backref='permissions',
secondary=permission_position
)
from sqlalchemy import func, or_,and_,not_
from app import app
from models import *
@app.route('/')
def index():
return "index"
# 查询所有员工
@app.route('/SelectAll')
def SelectAll():
# 得到Person表中所有数据(select * from person)
res=Person.query.all() #得到的是一个列表对象
for person in res:
#得到person对象
for key,value in person.__dict__.items():
if value!=None:
print(f"{key}:{value}",end=" ")
print()
return "SelectAll"
# 根据id来查找
@app.route('/Select_By_Id/<int:id>')
def Select_By_Id(id):
Person_list=Person.query.filter(Person.id==id) #得到的是一个sql语句
res=Person_list.all()
print(res) #当id=1时 [<Person 1>] 当没有找到时 []
return "Select_By_Id"
#条件语句
@app.route('/Filter')
def Filter():
# like 模糊查询
ret=Person.query.filter(Person.username.like("z%")).all()
# limit()限制返回条数
# ret2=Person.query.limit(2).all()
# 偏移1条记录,返回2条记录
ret2=Person.query.limit(2).offset(1).all()
# order_by() 排序 Person.id.desc() 降序 asc():升序
ret3=Person.query.order_by(Person.id.desc()).all()
# 分组 group_by query(Person.gender,func.count(Person.id))=>select gender,count(id) from person
ret4=db.session.query(Person.gender,func.count(Person.id)).group_by(Person.gender).all()
# 逻辑判断 and_,or_,not_
ret5=Person.query.filter(or_(Person.gender=="男",Person.age>18)).all()
print(ret) #[<Person 2>]
print(ret2) #[<Person 2>, <Person 3>]
print(ret3) #[<Person 4>, <Person 3>, <Person 2>, <Person 1>]
print(ret4) #[('女', 1), ('男', 3)]
print(ret5) #[<Person 1>, <Person 2>, <Person 3>, <Person 4>]
return "Filter"
# 添加员工
@app.route('/add_person')
def add_person():
# 创建员工对象
person = Person()
person.name="zhangsan"
person.age=18
person.save()
return 'add person'
# 用户修改
@app.route('/Person_Update')
def Person_Update():
person_obj=Person.query.get(1)
person_obj.age=30
# 提交事务
db.session.commit()
return "update"
@app.route('/Person_Del')
def Person_Del():
person=Person.query.get(2)
person.delete()
return "Person_Del"
#一对多添加
@app.route('/one_add')
def one_add():
#添加员工
person = Person(username="zhangsan",age=18,nickname="张三")
person2 = Person(username="lisi",age=28,nickname="李四")
person.save()
person2.save()
#添加职位
pos1=Position(name="职员",level=1)
pos2=Position(name="产品经理",level=2)
pos1.save()
pos2.save()
# 设置关系
# 张三的职位是职员 李四的职位是产品经理
# 正向设置关系
pos1=Position.query.filter(Position.level==1).first() #获取职员对象
person=Person.query.filter(Person.nickname=="张三").first() #获取张三对象
pos1.persons=[person]
pos1.save()
# 反向设置关系
pos2 = Position.query.filter(Position.level == 2).first() # 获取产品经理
person2 = Person.query.filter(Person.nickname == "李四").first() # 获取李四
person2.position=pos2
person2.save()
return "one_add"
#多对多添加
@app.route('/two_add')
def two_add():
#增加权限
p_list=["考勤权限","新闻权限","人事权限","权限管理"]
for p in p_list:
permission_obj=Permission(name=p,desc=p+'crud')
permission_obj.save()
# 增加职位
pos_obj=Position(name="开发工程师",level=3)
pos_obj2=Position(name="高级开发工程师",level=4)
pos_obj.save()
pos_obj2.save()
# 设置关系
#正向设置关系
# 给考勤权限设置 开发工程师 和高级工程师职位
per_obj=Permission.query.get(1)
per_obj.positions=[pos_obj,pos_obj2]
per_obj.save()
return "two_add"