建表sql
1 # -*- coding: UTF-8 -*- 2 3 from . import db 4 5 6 7 #多对多关系表,两组一对多,即为多对多 8 9 class Boy2Girl(db.Model): 10 11 __tablename__ = 'boy2girl' 12 13 nid = db.Column(db.Integer,primary_key=True) 14 15 #创建一对多关系,ForeignKey传入对应表的__tablename__.id 16 17 boy_id = db.Column(db.Integer,db.ForeignKey('boy.id')) 18 19 # 创建一对多关系,ForeignKey传入对应表的__tablename__.id 20 21 girl_id = db.Column(db.Integer,db.ForeignKey('girl.id')) 22 23 24 25 class Boy(db.Model): 26 27 __tablename__ = 'boy' 28 29 id = db.Column(db.Integer,primary_key=True) 30 31 name = db.Column(db.String(32),unique=True) 32 33 age = db.Column(db.Integer) 34 35 #并不会在数据库中生成列,做用为ORM调用时能够经过.来调用另外一张表 36 37 #例如boy.girl,girl.boy 38 39 #传入的参数为另外一张表的类名,关系表的表名,反向查询时的名字,能够为任意名字 40 41 girl = db.relationship('Girl',secondary = Boy2Girl.__tablename__,backref = 'boy') 42 43 car = db.relationship('Car',backref = 'boy') 44 45 #自引用 46 47 father_id = db.Column(db.Integer,db.ForeignKey('boy.id')) 48 49 #自引用时需添加remote_side=[id],一对一添加uselist=Flase 50 51 father = db.relationship('Comment',backref = 'child',remote_side=[id],uselist=Flase) 52 53 def __repr__(self): 54 55 return '<Boy %r>'%self.name 56 57 58 #高级多对多,关联表和普通多对多一致,好处是能够直接访问关联表,调用其中的其余字段 59 60 #多对多关系表,两组一对多,即为多对多 61 62 class Girl2Car(db.Model): 63 64 __tablename__ = 'girl2car' 65 66 nid = db.Column(db.Integer,primary_key=True) 67 68 #创建一对多关系,ForeignKey传入对应表的__tablename__.id 69 70 car_id = db.Column(db.Integer,db.ForeignKey('car.id')) 71 72 # 创建一对多关系,ForeignKey传入对应表的__tablename__.id 73 74 girl_id = db.Column(db.Integer,db.ForeignKey('girl.id')) 75 76 create_time = db.Column(db.DateTime,default=datetime.datetime.utcnow) 77 78 79 class Girl(db.Model): 80 81 __tablename__ = 'girl' 82 83 id = db.Column(db.Integer,primary_key=True) 84 85 name = db.Column(db.String(32),unique=True) 86 87 age = db.Column(db.Integer) 88 89 #cascade删除时删除全部关联项 90 91 #高级多对多,须要指定foreign_keys = [Girl2Car.car_id],手工管理外键 92 93 car = db.relationship('Girl2Car',foreign_keys = [Girl2Car.car_id],backref=db.backref('girl',lazy='joined'), 94 lazy='dynamic',cascade='all,delete-orphan') 95 96 97 98 def __repr__(self): 99 100 return '<Girl %r>' % self.name 101 102 103 104 class Car(db.Model): 105 106 __tablename__ = 'car' 107 108 id = db.Column(db.Integer,primary_key=True) 109 110 name = db.Column(db.String(32),unique=True) 111 112 #创建一对多关系,ForeignKey传入对应表的__tablename__.id,写在多的一对多中多的那边 113 114 boy_id = db.Column(db.Integer,db.ForeignKey('boy.id')) 115 116 #cascade删除时删除全部关联项 117 118 #高级多对多,须要指定foreign_keys = [Girl2Car.girl_id],手工管理外键 119 120 girl = db.relationship('Girl2Car',foreign_keys = [Girl2Car,girl_id],backref=db.backref('car',lazy='joined'), 121 lazy='dynamic',cascade='all,delete-orphan') 122 123 def __repr__(self): 124 125 return '<Car %r>'%self.name 126 127
查询shell
1 #查询所有 2 boys = Boy.query.all() 3 4 #排序 5 boys = Boy.query.order_by(Boy.age.desc()).all() 6 7 #`filter_by`和`filter`都是过滤条件,只是用法有区别`filter_by`里面能用`=`,不能用`!= `还有`> <` 等等 8 9 #过滤条件查询一个 10 boy1 = Boy.query.filter_by(id=1).first() 11 boy1 = Boy.query.filter(Boy.id=1).first() 12 13 #过滤条件查多个 14 boys = Boy.query.filter(Boy.id>1).all() 15 16 #切片查询 17 #限制返回条数 18 boys = Boy.query.filter(Boy.name!='jingqi').limit(2).all() 19 #从第三条开始返回查询结果 20 boys = Boy.query.filter(Boy.name!='jingqi').offset(2).all() 21 #切片返回记录 22 boys = Boy.query.filter(Boy.name!='jingqi').slice(2,3).all() 23 24 #模糊匹配,是十分耗费时间的,能不用就尽可能不要用。 25 boys = Boy.query.filter(Boy.name.like('jingqi')).all() 26 boys = Boy.query.filter(Boy.name.notlike('jingqi')).all() 27 28 #成员属于 29 boys = Boy.query.filter(Boy.name.in_(['jingqi','jingqi1'])).all() 30 boys = Boy.query.filter(Boy.name.notin_(['jingqi','jingqi1'])).all() 31 32 #选择条件 33 from flask_sqlalchemy import or_,and_,all_,any_ 34 boys = Boy.query.filter(or_(User.name=='jingqi',User.age==12)).all() 35 boys = Boy.query.filter(and_(User.name=='jingqi',User.age==12)).all() 36 37 #分页查询,page为第几页 38 pagination = Boy.query.order_by(Boy.id.desc()).paginate(page, per_page=10, error_out=False) 39 boys = pagination.items
增删改数据库
#建立删除表,能够在flask shell中操做 db.create_all() db.drop_all() #增 user1 = User(username='Jim',role=admin_role) db.session.add(user1) db.session.commit() #删 db.session.delete(admin_role) db.session.commit() #改 admin_role.name = 'AD' db.session.add(admin_role) db.session.commit() #回滚,在commit前均可以回滚到上次commit时的状态 db.seesion.rollback()
原生sql语句flask
1 id = request.args.get('id') 2 #原生sql 3 user1 = db.session.execute("SELECT * from user WHERE id="+id) 4 #防注入,使用占位符 5 conn = db.session.connection() 6 user1 = conn.execute("SELECT * from user WHERE id=%s", [id])