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])
相关文章
相关标签/搜索