flask中的关于数据库的操作

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(字段名 = ?)
过滤查询中的调价查询。

  1. 大于或者小于
boy = Boy.query.filter(Boy.id.__gt__(10)).all()  #大于 如果是大于等于是 __ge__
boy = Boy.query.filter(Boy.id.__lt__(10)).all   #小于 如果是小于等于是 __le__
  1. 包含以及模糊查询
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结尾的
  1. in 的关于
boy = Boy.query.filter(Boy.id.in_([1,2,3,4])).all()  #id 是1,2,3,4 的
  1. 逻辑操作
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),
               )

大体上和一对多差不多,唯一不同的是需要建立第三张表,这个手动生成的,这样才能建立关系(查询和一对多的操作一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值