Flask-SQLAlchemy數據庫操做

建表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])
相關文章
相關標籤/搜索