flask高级应用(三)

flask高级应用(三),第1张

flask高级应用(三) 一、条件查询 1、get查询

根据id去查询 单个

class BookDetailResource(Resource):

    def get(self, pk):
        book = Book.query.get(pk)
        book_fields = {
            "id": fields.Integer,
            "name": fields.String,
            "sn": fields.String
        }
        return marshal(book, book_fields)
2、filter查询

SQLAlchemy 默认是懒惰模式,就是 如果不执行 all()、first()、get()就不会真正查询数据库。

  • 如果我们filter查询 只想获取第一个 要使用first()

books = Book.query.filter(Book.name == name).first()

如果要所有查询结果

books = Book.query.filter(Book.name == name).all()
3、filter_by查询

这个与filter查询区别是,一个查询方法名称不同。

一个查询的字段声明不同

判断条件不在是双等号== 而是 =等号

books = Book.query.filter_by(name = name).first()
books = Book.query.filter_by(name = name).all()
4、比较运算符

对于 大于 等于 小于 这些 比较判断 我们要使用

例如

Book.id.__lt__(5) # 小于5
Book.id.__le__(5) # 小于等于5
Book.id.__gt__(5) # 大于5
Book.id.__ge__(5) # 大于等于5
books = Book.query.filter(Book.id.__lt__(5)).all()
5、逻辑运算符

对于多条件的,或关系、与关系、非关系

or_ and_ not_

from sqlalchemy import or_, and_, not_


books = Book.query.filter(or_(Book.name == "红楼梦", Book.name == "水浒传")).all()

books = Book.query.filter(and_(Book.sn == "10002", Book.name == "水浒传")).all()

books = Book.query.filter(not_(Book.sn == "10002")).all()
6、聚合函数
from sqlalchemy import func

func中 提供了 count、sum、avg 等 聚合函数

必须要使用 db.session 来查询

例如 统计所有图书的个数

r = db.session.query(func.count(Book.id)).all()

print(r) # [(5,)]
二、分页与排序 1、分页

分页的核心是,有一个start起始位置,count查询的个数

select * from 表 limit start,count

offset(start) 偏移量

limit(count) 查询几个

books = Book.query.offset(4).limit(2).all()
print("books:", books)
2、排序
books = Book.query.order_by(Book.id.asc()).all()

books = Book.query.order_by(Book.id.desc()).all()
三、一对多

我们以新闻表为例,定义两个表

新闻表:id、标题、内容、分类

分类表:id、分类名

在app.py文件中写入:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api,Resource,marshal,fields

app = Flask(__name__)

# 配置数据库
app.config["SQLALCHEMY_DATAbase_URI"] = "mysql://root:zf1234@127.0.0.1:3306/news"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config.update(RESTFUL_JSON={"ensure_ascii":False})

# 创建db对象  可以 *** 作数据库
db = SQLAlchemy(app)
api = Api(app)

# 定义model类
# 一对多 定义两个表,分别为新闻表和分类表
# 分类表:id、分类名
class Type(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(20))
    # 通过分类直接查询到所有新闻列表,反之,通过新闻表查询分类backref中定义分类
    news_list = db.relationship("News",backref="type")

    def __init__(self,name):
        self.name = name

# 新闻表 id、标题、作者、内容
class News(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(20))
    content = db.Column(db.Text)
    type_id = db.Column(db.Integer,db.ForeignKey("type.id"))

# 定义一个接口
class TypeResource(Resource):
    def get(self):
        type = Type.query.get(1003)
        # 根据分类查询该分类下的所有新闻
        print(type.news_list)
        # 根据新闻 找到对应的分类
        print(type.news_list[0].type.name)
        return marshal(type.news_list,{"title":fields.String,"content":fields.String})

api.add_resource(TypeResource,"/type")


新建一个任务管理器文件manager.py文件,写入:

# Manager管理,经营       Command 命令,指令
from flask_script import Manager,Command
# 导入app
from app import app,db
from flask_migrate import Migrate,MigrateCommand

# 创建一个命令管理器
manager = Manager(app)

# 要先把db给migrate框架
Migrate(app,db)

# 自定义一个命令--类
class AddCommand(Command):
    def run(self):
        print("我执行添加 *** 作")

# 使用装饰器 来定义一个命令
@manager.command
def migrate():
    print("我要执行数据库迁移")
    db.create_all()

# 把命令添加到管理器  参数1:命令的别名
manager.add_command("add",AddCommand)
manager.add_command("db",MigrateCommand)

if __name__ == '__main__':
    manager.run()
四、多对多

以文章为例,创建三个表

文章表:id、标题、内容

标签: id、名称

第三张表:文章表Id、标签ID

将我们上面的app.py改造一下

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api,Resource,marshal,fields

app = Flask(__name__)

# 配置数据库
app.config["SQLALCHEMY_DATAbase_URI"] = "mysql://root:zf1234@127.0.0.1:3306/news"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config.update(RESTFUL_JSON={"ensure_ascii":False})

# 创建db对象  可以 *** 作数据库
db = SQLAlchemy(app)
api = Api(app)

# 定义model类
# 一对多 定义两个表,分别为新闻表和分类表
# 分类表:id、分类名
class Type(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(20))
    # 通过分类直接查询到所有新闻列表,反之,通过新闻表查询分类backref中定义分类
    news_list = db.relationship("News",backref="type")

    def __init__(self,name):
        self.name = name

# 新闻表 id、标题、作者、内容
class News(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(20))
    content = db.Column(db.Text)
    type_id = db.Column(db.Integer,db.ForeignKey("type.id"))

# 定义一个接口
class TypeResource(Resource):
    def get(self):
        article = Article.query.get(1)
        print(article.tags)
        return "测试"

        # type = Type.query.get(1003)
        # print(type.news_list)
        # print(type.news_list[0].type.name)
        # return marshal(type.news_list,{"title":fields.String,"content":fields.String})

# 第三方
three_table = db.Table('article_tag',
                       db.Column('article_id',db.ForeignKey('article.id'),primary_key=True),
                       db.Column('tag_id',db.ForeignKey('tag.id'),primary_key=True))




# 文章表:id、标题、内容
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(20))
    content = db.Column(db.Text)
    tags = db.relationship('Tag', secondary=three_table, backref=db.backref('articles'))

# 标签:   id、名称
class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(20))


api.add_resource(TypeResource,"/type")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5156590.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存