建表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])