Flask使用flask_sqlalchemy操作MySQL

在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语句,以后有空在项目中试试这个

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/617.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。