flask_sqlalchemy

flask_sqlalchemy

flask_sqlalchemy是flask框架中,一个输入数据操作的模块。由于利用数据库的语句,对数据库的操作极不方便,便产生了flask_sqlalchemy,使开发者可以通过python语言来操纵数据库。

一些常用的数据文件操作
  • SQLALCHEMY_DATABASE_URI——连接数据的数据库
    MySQL数据库连接配置为mysql://username:password@server/db,其中username是用户名,password是密码,server是要连接数据库服务器的IP及端口,db是要连接的数据库库名;
    如:SQLALCHEMY_DATABASE_URI = ‘mysql://root:@localhost:3306/test’;
  • SQLALCHEMY_ECHO
    若设为True,SQLAlchemy记录所有发送到标准输出的语句,对跳是有帮助;
  • SQLALCHEMY_RECORD_QUERIES——显式地禁用或启用查询记录
    查询记录在调试或测试模式下自动启用;
  • SQLALCHEMY_NATIVE_UNICODE——显式地禁用原生的unicode
  • SQLALCHEMY_TRACK_MODIFICATIONS
    若设为True,SQLAlchemy将追踪对象的修改和发送信号;默认是None;
创建数据库中的表

在user的数据中创建两个表,User和Role。并向两个数据库中添加相应的数据。

from datetime import datetime

from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from sqlalchemy import desc

'''自己对于SQLchemy的理解,由于自己每一次手动连接数据库以及对数据库的操作极不方便,而开发者又对语言比较熟悉,
因此,python中内置了一个flask_sqlalchemy,使开发者可以通过模块来编写相应的程序,来实现对数据库的复杂操作。'''

app = Flask(__name__)
# 对app进行配置,指定连接的数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:westos@localhost/user'
# SQLALCHEMY将会追踪对象的修改并发送信号
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 创建一个数据库u对象,传入app表示的创建的对象已经连接到了自己创建Flask服务
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)

# 每一个类对应的是一个表,不同的表示之间可以相互有联系
'''
__table__可以指定表的名称,替代原来的类名
实现一个一对多的关系
*** 多的的一端写外键
*** 少的一端写反向引用
'''
# db.Model 是db的一个属性,然后这个属性存入的是个类,所以User继承于db.Model类
# 用户表
class User(db.Model):
    # primary_key是主键,数据是唯一的;autoincrement=True 默认数据是自增
    id = db.Column(db.Integer,autoincrement=True,primary_key=True)
    # unique=True 表示数据是唯一的
    name = db.Column(db.String(50),unique=True)
    passwd = db.Column(db.String(100))
    # default 表示默认值
    add_time = db.Column(db.DateTime,default=datetime.now())
    gender = db.Column(db.Boolean,default=True)
    # 用户的id,不能随便写,必须要使用外键关联其他表
    # role_id 必须在role表中id者一列有这个值
    role_id = db.Column(db.INTEGER,db.ForeignKey('role.id'))


    def __repr__(self):
        return '<user:%s>' %(self.name)

# 用户的角色表
class Role(db.Model):
    id = db.Column(db.Integer,autoincrement=True,primary_key=True)
    name = db.Column(db.String(50),unique=True)
    users = db.relationship('User',backref='role')

    def __repr__(self):
        return "<role:%s>" %(self.name)

# 注意:上面的两个表并没有数据,只是创建了表和表之间的关系


if __name__=="__main__":
    db.drop_all()
    # 删除数据库通过类创建的表中的所有表,原有不是通过类创建的表会仍然存在在数据库中
    # 创建所有的表
    db.create_all()


    # 向表中插入数据
    '''
    1.创建一个Python对象
    2.将对象添加到会话中
    3.提交会话
    注意:自己所传入的每一行数据对应上面三个步骤
    '''
    role1 = Role(name='超级会员')
    role2 = Role(name='会员')

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

    db.session.commit()

    # 添加100个用户
    for i in range(50):
        user = User(name='westos%d' %(i),passwd='westos',role_id=1)
        db.session.add(user)
    db.session.commit()

    for i in range(50):
        user = User(name='redhat%d' %(i),passwd='redhat',role_id=2)
        db.session.add(user)
    db.session.commit()
对表中的元素进行操作
  • 查询所有数据
print(Role.query.all())
 print(User.query.all())

结果:
在这里插入图片描述

  • 根据条件进行查找
print(User.query.filter_by(role_id=1).all())
  • 对于查找的内容进行更新
 u = User.query.filter_by(name='westos0').first()
    print(type(u))
    print(u)
    u.passwd='1253215'
    db.session.add(u)
    db.session.commit()

结果:
在这里插入图片描述

  • 一个查询函数对应多个过滤函数
# 对于数据的查询进行限制
    user = User.query.filter_by(role_id=1).limit(5).all()
    print(user,len(user))

    # 对于查询的数据进行排序
    user = User.query.filter_by(role_id=1).order_by(User.add_time).all()
    print(user)

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

    # offset 指定偏移量,limit 指输出量。类似于切片的操作
    user = User.query.filter_by(role_id=1).order_by(User.add_time).limit(5).offset(2).all()
    print(user)
    # 利用切片也可以达到上面的效果
    user = User.query.filter_by(role_id=1).order_by(User.add_time).slice(2,7).all()
    print(user)

    # 查看获取信息的数量
    count = User.query.filter_by(role_id=1).order_by(User.add_time).slice(2,7).count()
    print(count)

结果:
在这里插入图片描述

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

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值