• flask 自定义命令 sqllite /SQLAlchemy 简单使用


    flask shell类似,我们可以编写一个自定义命令来自动执行创建数据库表操作 ,sqllite

    import click
    @app.cli.command()
    @click.option('--drop',is_flag=True,help'Create and drop.')
    def initdb(drop):
    	if drop:
    		db.drop_all()
    	db.create_all()
    	click.echo('initialized database.')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    flask initdb  #创建
    flask initdb --drop #删除后创建
    
    • 1
    • 2

    数据库配置
    简化数据库操作,我们将使用 SQLAlchemy,一个 Python 数据库工具(ORM,即对象关系映射)。借助 SQLAlchemy,你可以通过定义 Python 类来表示数据库里的一张表(类属性表示表中的字段 / 列),通过对这个类进行各种操作来代替写 SQL 语句。这个类我们称之为模型类,类中的属性我们将称之为字段。

    import os
    import sys
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    WIN = sys.platform.startswith('win')
    if WIN:  # 如果是 Windows 系统,使用三个斜线
        prefix = 'sqlite:///'
    else:  # 否则使用四个斜线
        prefix = 'sqlite:'
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(app.root_path, 'data.db')
    db = SQLAlchemy(app)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    创建数据库模型

    calss User(db.Model):#(表名自动小写 user)
    	id = db.Column(db.Integer,primary_key = True)
    	name = db.Column(db.String(20))
    class Movie(db.Model):  # 表名将会是 movie
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(60))
        year = db.Column(db.String(4))
    字段类	说明
    db.Integer	整型
    db.String (size)	字符串,size 为最大长度,比如 db.String(20)
    db.Text	长文本
    db.DateTime	时间日期,Python datetime 对象
    db.Float	浮点数
    db.Boolean	布尔值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    简单的增加 删除操作

    from app import User ,Movie
    
    user = User('name = Da Liu')#创建
    m1 = Movie(title = 'Wo You Yi Ge Xiong Di Jiao Shunliu' ,year = '2002')
    
    db.session.add(user)#添加
    db.session.add(m1)
    
    db.session.commit()#提交
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    查询读取

    <模型类>.query.<过滤方法(可选)>.<查询方法>
    
    常见的过滤方法:
    filter()	使用指定的规则过滤记录,返回新产生的查询对象
    filter_by()	使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象
    order_by()	根据指定条件对记录进行排序,返回新产生的查询对象
    group_by()	根据指定条件对记录进行分组,返回新产生的查询对象
    
    常见的查询方法:
    all()	返回包含所有查询记录的列表
    first()	返回查询的第一条记录,如果未找到,则返回 None
    get(id)	传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回 None
    count()	返回查询结果的数量
    first_or_404()	返回查询的第一条记录,如果未找到,则返回 404 错误响应
    get_or_404(id)	传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回 404 错误响应
    paginate()	返回一个 Pagination 对象,可以对记录进行分页处理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    例子

    movie = Movie.query.first()
    user = User.query.all()
    movie.title  / movie.year
    >>> Movie.query.filter_by(title='Wo You Yi Ge Xiong Di Jiao Shunliu').first()  # 获取 title 字段值为 Mahjong 的记录
    >>> Movie.query.filter(Movie.title=='Wo You Yi Ge Xiong Di Jiao Shunliu').first()  # 等同于上面的查询,但使用不同的过滤方法
    
    • 1
    • 2
    • 3
    • 4
    • 5

    改动

    >>> movie = Movie.query.get(2)
    >>> movie.title = 'WALL-E' 
    >>> movie.year = '2008'
    >>> db.session.commit()
    
    • 1
    • 2
    • 3
    • 4

    删除

    >>> movie = Movie.query.get(1)
    >>> db.session.delete(movie)  # 使用 db.session.delete() 方法删除记录,传入模型实例
    >>> db.session.commit()  # 提交改动
    
    • 1
    • 2
    • 3
  • 相关阅读:
    使用 pubsub-js 进行消息发布订阅
    【靶场搭建】-02- 搭建OWASP靶机
    HTML 之 块级元素、行内元素和行内块元素之间的嵌套规则
    Vue
    51单片机的智能台灯控制系统仿真( proteus仿真+程序+原理图+报告+讲解视频)
    vue的基本使用
    netty学习
    探店通源码。短视频矩阵源码,look here
    U-BOOT小全(一)
    redux和Vuex的使用示例
  • 原文地址:https://blog.csdn.net/aqiangdeba/article/details/133234729