python笔记-flask-sqlachemy

使用flask-sqlalchemy创建表

from datetime import datetime
import  time
import pymysql
# 关于数据库操作的文件
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import  SQLAlchemy
from flask import  Flask
from sqlalchemy import desc
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:westos@localhost/User'
# SQLAlchemy 将会追踪对象的修改并且发送信号。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
app.config['SECRET_KEY'] = 'westos'
boostrap = Bootstrap(app)

# 默认情况下创建一个表, 表名为类名; 如果指定了__tablename__, 那么表名为你指定的名称;

class Student(db.Model):
    __tablename__ = "students"
    # sid: 表头的一列, db.SMALLINT代表存储的数据类型, primary_key(主键), 数据是唯一的;
    sid = db.Column(db.SMALLINT, primary_key=True)
    sname = db.Column(db.String(50))
    sage = db.Column(db.SMALLINT)

#  实现一对多(Role(1): User(n))的关系
#   - 多的一端写外键
#   - 少的一端写反向引用
class User(db.Model):
    # autoincrement=True自增
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    #  unique=True, name的值不能重复, 是唯一的;
    name = db.Column(db.String(50), unique=True)
    # 长度为100, 是因为网站密码一般会加密;
    passwd = db.Column(db.String(100))
    # 指定用户注册/创建的时间,
    # default, 指定默认值, datetime.now()获取当前时间;
    # 用户注册时间为当前时间;
    add_time = db.Column(db.DateTime, default=datetime.now())
    gender = db.Column(db.Boolean, default=True)
    # 用户的角色id,不能随便写, 必须要关联其他的数据库表(role) --- 外键
    role_id = db.Column(db.INTEGER, db.ForeignKey('role.id'))

    def __repr__(self):
        return '' %(self.name)

# 用户角色表
class Role(db.Model):
    # autoincrement=True自增
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    #  unique=True, name的值不能重复, 是唯一的;
    name = db.Column(db.String(50), unique=True)
    #  Role表中的users属性与User表关联, 并且User这个表中可以由role这个对象属性;
    users = db.relationship('User',backref='role')

    # 对象的字符串显示, 方便查询时使用
    def __repr__(self):
        return  "" %(self.name)

# 1. 创建定义的表结构
    # db.create_all()
    # 2. 删除定义的表结构
    # db.drop_all()

向表中添加信息

   #   3. *****************往表中插入数据;***************************
    # 向数据库插入数据分为三个步骤:
    #     创建Python对象
    #     把它添加到会话
    #     提交会话
    #
    # #   1). 创建用户角色;
    role1 = Role(name="超级会员")
    role2 = Role(name="会员")

    db.session.add(role1)
    db.session.add(role2)

    db.session.commit()

添加100个用户,其中50个为超级会员, 50个为会员;

   for i in range(50):
        u = User(name='westos%s' %(i), passwd='westos', role_id=1)
        db.session.add(u)
    db.session.commit()


    for i in range(50):
        u = User(name='redhat%s' % (i), passwd='redhat', role_id=2)
        db.session.add(u)
    db.session.commit()

查询表中数据

#  查询所有数据
    print(Role.query.all())
    print(User.query.all())

# 根据条件查询数据(筛选数据(filter_by)); slect * from table where xxx=xxx;
    print(User.query.filter_by(role_id=1).all())
    print(User.query.filter_by(role_id=2).all())


# 通过这种方式可以查看原生的sql语句
    user = User.query.filter(User.role_id==1)
    print(user)

    # 对于查询的信息进行显示限制;
    users = User.query.filter_by(role_id=1).limit(5).all()
    print(users, len(users), end='\n')

    # 对于查询的信息进行排序输出(默认情况由小到大进行排序), 如果想要由大到小: desc(User.add_time);
    users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).all()
    print(users)

    # 多个过滤函数加一个显示函数:
    users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).all()
    print(users)

 
# #  offset指定偏移量, limit 指定输出数量, 类似于切片操作;
    # #  1 2 3 4 5 6 7 8 9
    # # limit(5): 1 2 3 4 5
    # # limit(5).offset(2): 3 4 5 6 7
    users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).offset(2).all()
    print(users)
    # 切片操作li[2:7]
    users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2,7).all()
    print(users)

    count = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2, 7).count()
    print(count)

# 分页:第一个参数代表显示第几页的数据, 第二个参数代表每页显示多少条数据;
    users = User.query.paginate(1, 5)
    print(users.items)
    users = User.query.paginate(2, 5)
    print(users.items)

显示关联数据库信息

u = User.query.filter_by(name='westos0').first()
    print(u.name, u.passwd, u.add_time, u.role_id, u.role, u.role.id, u.role.name)

对指定的内容进行更新

# 对于找到的内容进行更新;
u = User.query.filter_by(name='westos0').first()
print(u)
u.passwd = '123456'
db.session.add(u)
db.session.commit()

flask-Bootstrap

1. 如何在flask中使用Bootstrap?

要想在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展,简化集成的过程。Flask-Bootstrap 使用pip安装:

pip install flask_bootstrap

2. Flask 扩展一般都在创建程序实例时初始化,下面是Flask_Bootstrap的初始化方法:

from flask_bootstrap import  Bootstrap

app = Flask(__name__)
bootstrap = Bootstrap(app)

初始化Flask-Bootstrap 之后,就可以在程序中使用一个包含所有Bootstrap 文件的基模板。这个模板利用Jinja2 的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中就有用来引入Bootstrap 的元素。

3. 如何引用bootatrap的基模板?

{%extends "bootstrap/base.html"%}

{%block title %}Flask{% endblock %}

这两个块分别表示页面中的导航条和主体内容。
在这个模板中,navbar 块使用Bootstrap 组件定义了一个简单的导航条。
content 块中有个

容器,其中包含一个页面头部。

4. Flask-Bootstrap定义的其他可用块:

参考链接: https://pythonhosted.org/Flask-Bootstrap/basic-usage.html#available-blocks
块名   说明
doc 整个html文档
html_attribs html标签属性
html   html标签中的内容
head head标签中的内容
title title标签中的内容
metas 一组meta标签
styles 层叠样式表定义
body_attribs body标签的属性
body body标签中的内容
navbar 用户定义的导航条
content 用户定义的页面内容
scripts 文档底部的JavaScript 声明

5. 如何继承原有内容:

上表中的很多块都是Flask-Bootstrap 自用的,如果直接重定义可能会导致一些问题。例如,Bootstrap 所需的文件在styles 和scripts 块中声明。如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2 提供的super() 函数。例如,如果要在衍生模板中添加新的JavaScript 文件,需要这么定义scripts 块:

{% block scripts %}
{{ super() }}

{% endblock %}

你可能感兴趣的:(python笔记-flask-sqlachemy)