在flask_sqlalchemy中,查询操作是通过query对象操作数据。最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
数据库会话也可以回滚,通过db.session.rollback()方法,实现会话提交数据前的状态。
之前写了一个sqlalchemy的对象关系映射操作mysql的教程:https://sulao.cn/post/610.html,现在更新一个flask下的flask_qlalchemy,用起来其实是和sqlalchemy一样的,只是有些微区别,整体用起来更加简单,主要是我用的vscode,用起来静态检查老是报错,但是代码是可正常运行的,我们来看看代码吧
#!/usr/bin/python3 #coding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/sulao' #查询时会显示原始SQL语句 #app.config['SQLALCHEMY_ECHO'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) class Category(db.Model): __tablename__ = 'zbp_category' cate_ID = db.Column(db.Integer, primary_key=True) cate_Name = db.Column(db.String(50)) cate_Order = db.Column(db.Integer) cate_Count = db.Column(db.Integer) cate_Alias = db.Column(db.String(255)) cate_Intro = db.Column(db.String) cate_RootID = db.Column(db.Integer) cate_ParentID = db.Column(db.Integer) cate_Template = db.Column(db.String(50)) cate_LogTemplate = db.Column(db.String(50)) cate_Meta = db.Column(db.String) def __init__(self, cate_Name, cate_Order, cate_Count, cate_Alias, cate_Intro,cate_RootID, cate_ParentID, cate_Template, cate_LogTemplate, cate_Meta): #self.cate_ID = cate_ID self.cate_Name = cate_Name self.cate_Order = cate_Order self.cate_Count = cate_Order self.cate_Alias = cate_Alias self.cate_Intro = cate_Intro self.cate_RootID = cate_RootID self.cate_ParentID = cate_ParentID self.cate_Template = cate_Template self.cate_LogTemplate = cate_LogTemplate self.cate_Meta = cate_Meta def __repr__(self): return '<Name %r>' % self.cate_Name '''数据查询''' #查询所有 ret = db.session.query(Category).all() for r in ret: print(r.cate_Name) #按条件查询 ret1 = db.session.query(Category).filter_by(cate_ID=2).first() print(ret1.cate_Name) #上面也可以写成以下方式,不匹配的使用可以使用逻辑非(!=)来取反 ret2 = db.session.query(Category).filter(Category.cate_ID==2).first() print(ret2.cate_Name) #模糊查询,返回结尾为‘笔记’的数据 ret3 = db.session.query(Category).filter(Category.cate_Name.endswith('笔记')).all() for r in ret3: print(r.cate_Name) #根据ID查询 ret4 = Category.query.get(1) print(ret4.cate_Name) '''上述方法db.session可以更换为表对象,例如Category.query.filter()''' '''or_ and_ not_ 和之前的sqlalchemy一样,只是~换成了not_''' '''更新数据''' ret5 = db.session.query(Category).filter(Category.cate_ID==13).first() ret5.cate_Name = '旧笔记测试' db.session.commit() #上述还可以使用update方法 db.session.query(Category).filter(Category.cate_ID==13).update({'cate_Name':'旧笔记测试2'}) '''删除数据''' ret6 = db.session.query(Category).filter(Category.cate_ID==11).first() db.session.delete(ret6) db.session.commit() '''添加数据''' #添加单条数据 data = Category(cate_Name='新的笔记2',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta='') db.session.add(data) db.session.commit() #添加多条数据 db.session.add_all([ Category(cate_Name='新的笔记2',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta=''), Category(cate_Name='新的笔记3',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta=''), Category(cate_Name='新的笔记4',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta='') ]) db.session.commit()
这里有个知识点要说,添加数据时会报错,要求你添加自增字段的值,但是在mysql或者程序中自增字段是不需要我们主动去插入的,然后这里我们需要注释掉__init__初始化的过程中cate_ID,为什么会这样的,因为设置cate_ID的初始化,Category对象不传入就没办法自动创建。
flask版的sqlalchemy总体来说用起来更加简单,不知道是不是更高效,至少代码上是更高效的,之前一直写的原生SQL语句,以后有空在项目中试试这个