python flask-sqlalchemy

使用flask-sqlalchemy创建表

# python3 , python2, MySQLdb
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:971203@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 '<User:%s>' %(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  "<Role:%s>" %(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()

在这里插入图片描述

# # 2). 添加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()

在这里插入图片描述

查询表中数据

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

在这里插入图片描述

# # 5. 根据条件查询数据(筛选数据(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)


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

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


    # 10. 多个过滤函数加一个显示函数:
    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)

在这里插入图片描述

# 11. 分页:第一个参数代表显示第几页的数据, 第二个参数代表每页显示多少条数据;
    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)

在这里插入图片描述

对指定的内容进行更新

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zcx1203/article/details/83590582