flask中关于对数据库的操作和djiango中有类似的行为。
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
manage = Manager(app)
Migrate(app,db)
manage.add_command('db',MigrateCommand)
if __name__ == '__main__':
manage.run()
命令
python db init
python db migrate -m '注释'
python db upgrade
from flask-sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app=app)
#男生表
class Boy(db.Model):
_tablename__ = "tb_boy" # 数据库中对应的表的名称
id = db.Column(db.Integer, primary_key=True, autoincrement=True,doc = '主键')
#doc 字段提示内容
name = db.Column(db.String(20),unique = Ture)
age = db.Column(db.Integer,deafult = 1)
girlFriend = db.Column(db.Ineger(10),db.ForeignKey('tb_girl.id'))
#女生表
class Boy(db.Model):
_tablename__ = "tb_girl" # 数据库中对应的表的名称
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20),unique = Ture)
age = db.Column(db.Integer,deafult = 1)
关于数据库的操作。
第一种
boy = Boy()
boy.name = 'wwq'
boy.age = 12
boy.girlFriend = 1
db.session.add(boy)
db.session.commit()
第二种
boy = Boy(name = 'wwq',age = 12,girlFriend = 1)
db.session.add(boy)
db.session.commit()
boy = Boy.query.filter_by(name='wwq').first()
db.session.delete(boy)
db.session.commit()
boy = Boy.query.filter_by(name='wwq').first()
boy.name = 'lqm'
db.session.commit()
查找是日常使用中的重中之重。
boy = Boy.query.all() #获取的是一个集合,里面都是符合对象
num = Boy.query.count()
boy = Boy.query.first() #查找出来的就是一个对象,不是集合。
boy = Boy.quert.get(1) # get只能通过id进行查询
boy = Boy.query.filter(Boy.name = 'wwq').first()
boy = Boy.query.filter_by(name = 'wwq').first()
filter和filter_by的区别
filter的语法是 :filter(cls.字段名 == ?)
filter_by的语法是:filter_by(字段名 = ?)
过滤查询中的调价查询。
boy = Boy.query.filter(Boy.id.__gt__(10)).all() #大于 如果是大于等于是 __ge__
boy = Boy.query.filter(Boy.id.__lt__(10)).all #小于 如果是小于等于是 __le__
boy = Boy.query.filter(Boy.name.contains('g')).all() # 名字中带有g的
boy = Boy.query.filter(Boy.name.startswith('w')).all() # 名字以w开头的
boy = Boy.query.filter(Boy.name.swith('w')).all() # 名字以w结尾的
boy = Boy.query.filter(Boy.id.in_([1,2,3,4])).all() #id 是1,2,3,4 的
boy = Boy.query.filter(and_(Boy.id == 1,Boy.name == 'wwq')) # 两个条件都符合
boy =Boy.query.filter(Boy.id == 1,Boy.name == 'wwq') # 和and效果一样
boy = Boy.query.filter(or_(Boy.id == 1,Boy.name == 'wwq')) # 两个条件符合一个即可
boy = Boy.query.filter(not_(Boy.id == 1)) #id不等于1的
boy = Boy.query.filter(Boy.id != 1) #id不等于1的,等效于not
boy = Boy.query.order_by('id').all() #跟进id进行排序
boy = Boy.query.order_by('-id').all() # 逆序
boy = Boy.query.limit(100).all() # 取100条
boy = Boy.query.offset(100).all() # 跳过100条的剩下所有
注意,要先排序才能使用limit和offset
class Students(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=False, nullable=False)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
class Grade(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
g_name = db.Column(db.String(30), unique=True, nullable=False)
students = db.relationship('Students', backref='grade')
__tablename__ = 'grade'
学生表和班级表示多对一的关系。在设计时多的一方里面设置外键,就是学生表,和班级的id关联,在少的一方建立关系,就是relationship,里面backref里的参数是反向查找是用的参数,students这个字段不会建立真实的字段,只是单纯表示关系
有班级查找学生
Student = Grade.query.get(1).students
由学生查找班级
class = Student.query.get(1).grade #这个grade就是我们反向查找的关键字。
class Students(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=False, nullable=False)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
c_name = db.Column(db.String(10), unique=True, nullable=False)
students = db.relationship('Students', secondary='s_c', backref='cou')
__tablename__ = 'course'
b.Table('s_c',
db.Column('s_id', db.Integer, db.ForeignKey('students.id'), primary_key=True),
db.Column('c_id', db.Integer, db.ForeignKey('course.id'), primary_key=True),
)
大体上和一对多差不多,唯一不同的是需要建立第三张表,这个手动生成的,这样才能建立关系(查询和一对多的操作一样)